From f413af60f531fb832dd503715d80f37d4923097d Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 2 Jul 2026 19:26:01 +0700 Subject: [PATCH 01/61] fix(facebook): return video/reel analytics instead of erroring on the missing insights edge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit postAnalytics always called /{postId}/insights, but that edge only exists on page feed posts. Video/reel and story posts store a bare id whose node has no insights edge, so Facebook returned "(#100) Tried accessing nonexisting field (insights)" — surfaced in prod as "Error fetching Facebook post analytics: ApplicationFailure: Unknown Error". postAnalytics now branches on the stored releaseId shape (the only available discriminator, since no post type is persisted for analytics): - Feed post ({pageid}_{postid}, contains "_") -> unchanged: /{postId}/insights with the existing metrics/mapping. No regression. - Video/reel (bare numeric id) -> /{videoId}/video_insights on v23.0, mapped to AnalyticsData: total_video_impressions -> Impressions, total_video_views -> Views, total_video_reactions_by_type_total -> Reactions (metric names verified against the current v23.0 docs). - Story (bare id, no usable insights via this path) -> clean [], no error. The video call uses plain fetch (not this.fetch) so a "(#100) nonexisting field (video_insights)" / empty response yields a quiet [] instead of throwing. A "nonexisting field" error stays silent (expected for stories); any other error (bad metric name, token, permissions) is logged via console.warn so a silent empty result is diagnosable without breaking the statistics page. postAnalytics still never throws. Tested locally against a freshly connected Facebook page: published a video post, confirmed its releaseId resolves to a real video node, and that /{videoId}/video_insights returns {"data":[]} (no data yet) with NO "(#100) nonexisting field" or "must be one of" error — i.e. the old crash is gone, the metric names are valid, and the app returns a clean [] for the no-data-yet case. Co-Authored-By: Claude Opus 4.8 --- .../integrations/social/facebook.provider.ts | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 7c287152b9..7d98976710 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -814,6 +814,19 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { ): Promise { const today = dayjs().format('YYYY-MM-DD'); + // The stored id (releaseId) shape depends on the post type set in post(): + // - feed post -> `{pageid}_{postid}` (contains `_`), has an `insights` edge + // - reel/video -> bare numeric video id, NO `insights` edge (only `video_insights`) + // - story -> bare story id, no usable insights via this path + // There is no separate stored type, so id shape is the discriminator. Calling + // `/{videoId}/insights` on a video/story node returns + // `(#100) Tried accessing nonexisting field (insights)`, which is what surfaced + // in prod as "Error fetching Facebook post analytics: ApplicationFailure". Route + // bare ids to the video-only edge instead. + if (!postId.includes('_')) { + return this.videoPostAnalytics(accessToken, postId, today); + } + try { // Fetch post insights from Facebook Graph API. // post_impressions_unique was deprecated by Meta on 2026-06-15; it is replaced @@ -884,4 +897,89 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { return []; } } + + // Video/reel posts store a bare video id whose node has no `insights` edge; their + // analytics live on the `/{videoId}/video_insights` edge instead. Story posts also + // store a bare id but have no usable insights here — the video_insights call comes + // back with an `error` (or empty data), which we swallow to an empty result so a + // single story/video can't break the statistics page. + private async videoPostAnalytics( + accessToken: string, + videoId: string, + today: string + ): Promise { + try { + // Metric names verified against the Graph API v23.0 video_insights docs: + // - total_video_impressions: times the video was shown + // - total_video_views: 3s+ (or full, if shorter) plays + // - total_video_reactions_by_type_total: reactions object, keyed by type + // Use plain fetch (not this.fetch) so a `(#100) nonexisting field` / story + // response doesn't throw an ApplicationFailure — we want a quiet `[]` instead. + const { data, error } = await ( + await fetch( + `https://graph.facebook.com/v23.0/${videoId}/video_insights?metric=total_video_impressions,total_video_views,total_video_reactions_by_type_total&access_token=${accessToken}` + ) + ).json(); + + // Stories (and videos without this edge) come back with an error / no data — + // return an empty result quietly rather than logging a scary error. But a + // `nonexisting field (video_insights)` is the only "expected" error here; any + // other error (bad metric name, token, permissions) means the fix is silently + // returning empty when it shouldn't be, so surface it as a warning (not a throw, + // not a scary error) so it's diagnosable without breaking the statistics page. + if (error || !data || data.length === 0) { + if (error && !/nonexisting field/i.test(error.message || '')) { + console.warn('Facebook video_insights returned an error:', { + videoId, + error, + }); + } + return []; + } + + const result: AnalyticsData[] = []; + + for (const metric of data) { + const value = metric.values?.[0]?.value; + if (value === undefined) continue; + + let label = ''; + let total = ''; + + switch (metric.name) { + case 'total_video_impressions': + label = 'Impressions'; + total = String(value); + break; + case 'total_video_views': + label = 'Views'; + total = String(value); + break; + case 'total_video_reactions_by_type_total': + // This returns an object with reaction types + if (typeof value === 'object') { + const totalReactions = Object.values( + value as Record + ).reduce((sum: number, v: number) => sum + v, 0); + label = 'Reactions'; + total = String(totalReactions); + } + break; + } + + if (label) { + result.push({ + label, + percentageChange: 0, + data: [{ total, date: today }], + }); + } + } + + return result; + } catch (err) { + console.error('Error fetching Facebook video post analytics:', err); + return []; + } + } } From 03bea3def3c339344842e7169e7008d678a1fb4f Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 23 Jul 2026 14:17:32 +0700 Subject: [PATCH 02/61] fix(linkedin-page): namespace step-1 internalId so page connect can't hijack the personal channel Co-Authored-By: Claude Fable 5 --- .../src/integrations/social/linkedin.page.provider.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts index 3c37b67a3b..e701423300 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts @@ -254,7 +254,9 @@ export class LinkedinPageProvider ).json(); return { - id: id, + // namespaced placeholder so the in-between row never collides with the + // personal LinkedIn channel row (same org + same member sub) + id: `${this.identifier}_${id}`, accessToken, refreshToken, expiresIn, From 8f92a37e0c5824c61d1598d889fa7664832ab72b Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 6 Aug 2026 18:58:15 +0700 Subject: [PATCH 03/61] fix(pinterest): read pin analytics from summary_metrics instead of lifetime_metrics postAnalytics requests IMPRESSION, PIN_CLICK, OUTBOUND_CLICK and SAVE, but read the results from lifetime_metrics. Pinterest returns period metrics in summary_metrics; lifetime_metrics only ever carries lifetime metric types (TOTAL_COMMENTS / TOTAL_REACTIONS), and a request cannot mix lifetime and non-lifetime types. So lifetime_metrics was always empty and every Pinterest pin showed no stats. Verified against the live API: published a real pin, pre-fix the method returned [], post-fix it returns all four metrics. Co-Authored-By: Claude Fable 5 --- .../integrations/social/pinterest.provider.ts | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 98100cbf25..fd3acd24fe 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -638,40 +638,43 @@ export class PinterestProvider const result: AnalyticsData[] = []; const metrics = data.all; - if (metrics.lifetime_metrics) { - const lifetimeMetrics = metrics.lifetime_metrics; + // The requested metric types are period metrics: Pinterest returns them + // in summary_metrics, never in lifetime_metrics (that only ever carries + // TOTAL_COMMENTS / TOTAL_REACTIONS). + if (metrics.summary_metrics) { + const summaryMetrics = metrics.summary_metrics; - if (lifetimeMetrics.IMPRESSION !== undefined) { + if (summaryMetrics.IMPRESSION !== undefined) { result.push({ label: 'Impressions', percentageChange: 0, - data: [{ total: String(lifetimeMetrics.IMPRESSION), date: today }], + data: [{ total: String(summaryMetrics.IMPRESSION), date: today }], }); } - if (lifetimeMetrics.PIN_CLICK !== undefined) { + if (summaryMetrics.PIN_CLICK !== undefined) { result.push({ label: 'Pin Clicks', percentageChange: 0, - data: [{ total: String(lifetimeMetrics.PIN_CLICK), date: today }], + data: [{ total: String(summaryMetrics.PIN_CLICK), date: today }], }); } - if (lifetimeMetrics.OUTBOUND_CLICK !== undefined) { + if (summaryMetrics.OUTBOUND_CLICK !== undefined) { result.push({ label: 'Outbound Clicks', percentageChange: 0, data: [ - { total: String(lifetimeMetrics.OUTBOUND_CLICK), date: today }, + { total: String(summaryMetrics.OUTBOUND_CLICK), date: today }, ], }); } - if (lifetimeMetrics.SAVE !== undefined) { + if (summaryMetrics.SAVE !== undefined) { result.push({ label: 'Saves', percentageChange: 0, - data: [{ total: String(lifetimeMetrics.SAVE), date: today }], + data: [{ total: String(summaryMetrics.SAVE), date: today }], }); } } From 96e46cfec08ae61889294f76f67e244a64137eb9 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 11 Aug 2026 13:33:09 +0700 Subject: [PATCH 04/61] fix(tiktok): correct picture_size_check_failed message and pre-check image sizes TikTok returns fail_reason `picture_size_check_failed` when media violates its size rules, and we mapped it to "Video must be at least 720p, Picture must no exceed 1080p". Both halves were wrong or unhelpful: TikTok documents no minimum for photos, "1080p" never said which dimension, and the 720p video claim has no basis in the docs. A customer hit this on TikTok carousels created through the public API. Her images were 941x1672 (valid), but each failing carousel also contained a 1086x1448 image - 6px over the 1080 limit on the shorter side - and a single oversized image fails the entire carousel. TikTok never reports which image failed, so the generic message sent her resizing images that were already fine. Verified against the real API on a connected TikTok channel, uploading through the public API so the media reaches TikTok at its original dimensions: 480x640 -> PUBLISHED (disproves the "at least 720p" claim) 320x320 -> FAILED (picture_size_check_failed, confirms the 360 floor) 5000x5000 -> PUBLISHED (TikTok does not enforce its documented 4096 max) The message therefore claims only what was verified: the 1080 image ceiling and the 360 video floor. The documented 4096 ceiling is omitted because TikTok accepted a 5000x5000 video. `checkValidity` now measures photos up front and names the offending image, so the failure surfaces at save time instead of hours later at publish. It mirrors the existing Pinterest check and reuses `getImageDimensions`. Videos are not pre-checked: there is no ffmpeg dependency server-side, so video size still only surfaces at publish through the corrected message. Already-scheduled carousels are not re-validated - `checkValidity` only runs on create/update - so existing invalid posts will still fail at publish, now with the corrected message. Co-Authored-By: Claude Opus 5 (1M context) --- .../integrations/social/tiktok.provider.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts index c1eb7c3235..bdcae267ea 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -67,6 +67,22 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { ) { return 'You need one media'; } + + // TikTok fails the whole photo post when a single image is oversized, and + // the status only says `picture_size_check_failed` without naming it. + if (firstItems?.every((p) => (p?.path?.indexOf?.('mp4') ?? -1) === -1)) { + const dimensions = await Promise.all( + firstItems?.map((p) => this.getImageDimensions(p?.path)) ?? [] + ); + const tooBig = dimensions.findIndex( + (p) => Math.min(p?.width ?? 0, p?.height ?? 0) > 1080 + ); + if (tooBig > -1) { + return `Image ${tooBig + 1} is ${dimensions[tooBig]?.width}x${ + dimensions[tooBig]?.height + }, TikTok allows a maximum of 1080px on the shorter side`; + } + } return true; } @@ -255,7 +271,8 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { if (body.indexOf('picture_size_check_failed') > -1) { return { type: 'bad-body' as const, - value: 'Video must be at least 720p, Picture must no exceed 1080p', + value: + 'Media size not supported by TikTok: images up to 1080px on the shorter side, videos at least 360px on both sides', }; } From 8bcb2f548b665b2e443610ed354691a4fcc240ae Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Wed, 12 Aug 2026 14:41:17 +0700 Subject: [PATCH 05/61] fix(facebook): flag channels that hold a non-page token as needing reconnection A Facebook channel can end up holding the user's token instead of the page's: if the page is only visible through a Business portfolio and was never ticked in the OAuth page list, Graph returns no access_token for it, fetchPageInformation passes undefined to the update, and Prisma leaves the between-steps user token in place. The channel then looks connected while every publish is rejected with "(#200) Unpublished posts must be posted to a page as the page itself". That error was unmapped, so it surfaced as a generic "Unknown Error" on every post while the channel kept reporting as healthy - the user had no way to tell a token problem from a content problem. Map it to refresh-token so the channel is flagged, the reconnect notification is sent, and the post is not retried against a token that can never work. Co-Authored-By: Claude Opus 5 (1M context) --- .../src/integrations/social/facebook.provider.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 5ade76092b..0012cd3784 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -81,6 +81,20 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { }; } + // The token is valid but belongs to the user, not to the page - the page + // was never granted to the app, so only reconnecting can fix it + if ( + body.indexOf( + 'Unpublished posts must be posted to a page as the page itself' + ) > -1 + ) { + return { + type: 'refresh-token' as const, + value: + 'Postiz is not authorized to publish as this page, please reconnect the channel', + }; + } + if (body.indexOf('1366046') > -1) { return { type: 'bad-body' as const, From fa69f42e35b92ae7976d35c7139b7d659cd52b22 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Fri, 14 Aug 2026 14:24:23 +0700 Subject: [PATCH 06/61] fix(facebook): map (#200) permission errors to a curated message Facebook rejects page publishes with an OAuthException code 200 when the connected account lacks pages_manage_posts / pages_read_engagement or sufficient page role. This previously fell through handleErrors to the 'Unknown Error' placeholder, so the failure email (and, once merged, the curated calendar tooltip from #1868) showed nothing actionable. Per Meta's docs, codes 200-299 are API Permission errors, so the (#200) marker always denotes a permissions problem. As a side effect, the preset retry helper no longer treats these as 'Unknown Error', avoiding a wasted second publish attempt. Co-Authored-By: Claude Fable 5 --- .../src/integrations/social/facebook.provider.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 5ade76092b..6f082c0522 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -81,6 +81,14 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { }; } + if (body.indexOf('(#200)') > -1) { + return { + type: 'bad-body' as const, + value: + 'Facebook rejected the post due to missing permissions. Make sure your Facebook account has full content access to the Page, then reconnect the channel.', + }; + } + if (body.indexOf('1366046') > -1) { return { type: 'bad-body' as const, From cd1e40dcc3cc9a62904217d71418cce24602e2c7 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 18 Aug 2026 09:41:02 +0700 Subject: [PATCH 07/61] fix(instagram): map (#200) permission errors to a curated message too The same Graph (#200) OAuthException surfaces on the Instagram (Facebook-login) provider when the connected user lacks sufficient permissions on the Facebook Page linked to the Instagram account. Map it the same way as in the Facebook provider (non-retryable bad-body), placed before the generic '190,' rule; instagram-standalone delegates to the same handleErrors. Co-Authored-By: Claude Fable 5 --- .../src/integrations/social/instagram.provider.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 1ab4c09155..e4c5b81a70 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -307,6 +307,14 @@ export class InstagramProvider }; } + if (body.indexOf('(#200)') > -1) { + return { + type: 'bad-body' as const, + value: + 'Facebook rejected the post due to missing permissions. Make sure your Facebook account has full content access to the Page linked to this Instagram account, then reconnect the channel.', + }; + } + if (body.indexOf('Not enough permissions to post') > -1) { return { type: 'bad-body' as const, From 5d3acd768a6b099e84646c9e7eba3d2c357830cf Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 18 Aug 2026 16:41:01 +0700 Subject: [PATCH 08/61] fix: reddit settings type only accepts self, link, media The Reddit DTO advertised type as link/self/image/video/videogif, but the provider only implements self, link and media (upload the first attached file). Other values were forwarded to Reddit as kind without a file and always failed with BAD_URL. Validate type with @IsIn and fix the public API / MCP schema description. Also initialise url to '' when a subreddit is picked in the composer, so the URL input is controlled from mount (fixes the React uncontrolled to controlled warning) and empty link URLs are validated. Co-Authored-By: Claude Fable 5 --- .../components/new-launch/providers/reddit/subreddit.tsx | 1 + .../src/dtos/posts/providers-settings/reddit.dto.ts | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx b/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx index c3bdd53ffb..ae3b2d5a4f 100644 --- a/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx +++ b/apps/frontend/src/components/new-launch/providers/reddit/subreddit.tsx @@ -90,6 +90,7 @@ export const Subreddit: FC<{ ...restrictions, type: restrictions.allow[0], media: [], + url: '', }, }, }); diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts index 4a8f2a13fe..f4d4d813c1 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts @@ -2,6 +2,7 @@ import { ArrayMinSize, IsBoolean, IsDefined, + IsIn, IsString, IsUrl, Matches, @@ -37,10 +38,11 @@ export class RedditSettingsDtoInner { title: string; @IsString() - @MinLength(2) + @IsIn(['self', 'link', 'media']) @IsDefined() @JSONSchema({ - description: 'Must be any of link, self (normal post), image, video, videogif', + description: + "Must be one of self (text post), link (requires url), media (uploads the post's first attached image or mp4 video)", }) type: string; From cf0c8ff70603a82adc5b4e0313768616902148e3 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 20 Aug 2026 12:03:23 +0700 Subject: [PATCH 09/61] fix(bluesky): surface the underlying error when preparation keeps failing After 5 failed preparation attempts the provider threw a generic "Could not prepare the post for Bluesky" BadBody with an empty json payload, swallowing the real reason (e.g. the video service rejecting an oversized upload). Include the underlying error message in both the BadBody json ({"message": ...}) and the user-facing failure message, so the bell notification and failure email tell the user what actually went wrong. Co-Authored-By: Claude Fable 5 --- .../src/integrations/social/bluesky.provider.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts index 2ec32a86cc..a7c65577ca 100644 --- a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts @@ -605,11 +605,12 @@ export class BlueskyProvider extends SocialAbstract implements SocialProvider { // this is safe and beats exhausting the check budget into a misleading // "check your account" warning. if ((pendingData.prepFailures || 0) >= 4) { + const reason = (err as any)?.message || String(err); throw new BadBody( 'bluesky', - JSON.stringify({}), + JSON.stringify({ message: reason }), {} as any, - 'Could not prepare the post for Bluesky, nothing was published, please try again' + `Could not prepare the post for Bluesky, nothing was published: ${reason}` ); } From 3000fdddbe5b2609527feb48cfd3f0e0d5419e36 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 20 Aug 2026 12:38:49 +0700 Subject: [PATCH 10/61] fix(reddit): strip leading/trailing slashes from subreddit names The subreddit picker stores Reddit's search result url verbatim ("/r/Name/"), and the sr normalization only removed the "/r/" prefix, so submits were sent with a trailing slash ("name/"). Reddit accepts that shape intermittently but sometimes rejects it with SUBREDDIT_NOEXIST even though the community exists. Strip leading and trailing slashes at both normalization sites. Co-Authored-By: Claude Fable 5 --- .../src/integrations/social/reddit.provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts index 627645b360..bdd206f7c1 100644 --- a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts @@ -443,7 +443,7 @@ export class RedditProvider extends SocialAbstract implements SocialProvider { // finds the armed marker and asks Reddit instead of resubmitting blindly. const value = data.subreddits[data.cursor].value; data.armed = { - sr: value.subreddit.replace('/r/', '').toLowerCase(), + sr: value.subreddit.replace('/r/', '').replace(/^\/+|\/+$/g, '').toLowerCase(), title: value.title || '', armedAt: Date.now(), media: value.type === 'media', @@ -502,7 +502,7 @@ export class RedditProvider extends SocialAbstract implements SocialProvider { } : {}), text: data.message, - sr: value.subreddit.replace('/r/', '').toLowerCase(), + sr: value.subreddit.replace('/r/', '').replace(/^\/+|\/+$/g, '').toLowerCase(), }; const all = await ( From b52cd59826b1bdc60c3f564112edbfcd999a5bea Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 20 Aug 2026 15:55:29 +0700 Subject: [PATCH 11/61] fix(reddit): also strip a prefix-less r/ from subreddit names Public-API users sometimes type "r/name" without the leading slash, which the '/r/' string replace left untouched. Normalize both prefix shapes with one regex so every input form resolves to the bare name. Co-Authored-By: Claude Fable 5 --- .../src/integrations/social/reddit.provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts index bdd206f7c1..3d4eac5852 100644 --- a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts @@ -443,7 +443,7 @@ export class RedditProvider extends SocialAbstract implements SocialProvider { // finds the armed marker and asks Reddit instead of resubmitting blindly. const value = data.subreddits[data.cursor].value; data.armed = { - sr: value.subreddit.replace('/r/', '').replace(/^\/+|\/+$/g, '').toLowerCase(), + sr: value.subreddit.replace(/^\/?r\//, '').replace(/^\/+|\/+$/g, '').toLowerCase(), title: value.title || '', armedAt: Date.now(), media: value.type === 'media', @@ -502,7 +502,7 @@ export class RedditProvider extends SocialAbstract implements SocialProvider { } : {}), text: data.message, - sr: value.subreddit.replace('/r/', '').replace(/^\/+|\/+$/g, '').toLowerCase(), + sr: value.subreddit.replace(/^\/?r\//, '').replace(/^\/+|\/+$/g, '').toLowerCase(), }; const all = await ( From bd781c1cd87f6bb3e1401d0fce4fd2afeec61e9e Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Sun, 23 Aug 2026 09:57:45 +0700 Subject: [PATCH 12/61] fix: count Threads post length in UTF-8 bytes Meta's Threads API counts the 500-character post limit in UTF-8 bytes (https://developers.facebook.com/docs/threads/posts), while Postiz counted UTF-16 code units, so a post with curly quotes, accented letters or emoji could pass the editor counter and the server validation and then be rejected by Threads at publish time. A thread whose second part was affected published only its first part. Adds a countLength helper (X keeps twitter-text weighted length, Threads uses UTF-8 byte length, everything else plain length) and uses it in the /posts/valid check and in the editor character pill, so both sides flag the same text. The global-mode pill now shows the count for the channel whose limit it displays instead of the raw length. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01TEjfd79TJocNAFULswHkXV --- .../launches/information.component.tsx | 43 +++++++++++++------ libraries/helpers/src/utils/count.length.ts | 12 ++++++ .../database/prisma/posts/posts.service.ts | 11 ++--- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/apps/frontend/src/components/launches/information.component.tsx b/apps/frontend/src/components/launches/information.component.tsx index c734429f45..718a8eb643 100644 --- a/apps/frontend/src/components/launches/information.component.tsx +++ b/apps/frontend/src/components/launches/information.component.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { FC, Fragment, useMemo } from 'react'; +import React, { FC, Fragment, useCallback, useMemo } from 'react'; import { useLaunchStore } from '@gitroom/frontend/components/new-launch/store'; import { useShallow } from 'zustand/react/shallow'; import clsx from 'clsx'; @@ -8,6 +8,7 @@ import SafeImage from '@gitroom/react/helpers/safe.image'; import { capitalize } from 'lodash'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { hasLinks } from '@gitroom/helpers/utils/strip.links'; +import { countLength } from '@gitroom/helpers/utils/count.length'; const Valid: FC = () => { return ( @@ -91,6 +92,13 @@ export const InformationComponent: FC<{ const showStripLinkWarning = stripLinkNames.length > 0; + const countFor = useCallback( + (identifier?: string) => countLength(identifier || '', text || ''), + [text] + ); + + const currentChars = countFor(currentIntegration?.identifier); + const isInternal = useMemo(() => { if (!isGlobal) { return []; @@ -113,11 +121,11 @@ export const InformationComponent: FC<{ return false; } - if (totalChars > totalAllowedChars && !isGlobal) { + if (currentChars > totalAllowedChars && !isGlobal) { return false; } - if (totalChars <= totalAllowedChars && !isGlobal) { + if (currentChars <= totalAllowedChars && !isGlobal) { return true; } @@ -127,7 +135,10 @@ export const InformationComponent: FC<{ return false; } - return totalChars > (chars?.[p.integration.id] || 0); + return ( + countFor(p.integration.identifier) > + (chars?.[p.integration.id] || 0) + ); }) ) { return false; @@ -137,6 +148,8 @@ export const InformationComponent: FC<{ }, [ totalAllowedChars, totalChars, + currentChars, + countFor, isInternal, isPicture, chars, @@ -152,11 +165,11 @@ export const InformationComponent: FC<{ const limits = selectedIntegrations .map((p, index) => ({ limit: chars?.[p.integration.id] || 0, + count: countFor(p.integration.identifier), isInternal: isInternal[index], })) .filter((item) => !item.isInternal && item.limit > 0) - .map((item) => item.limit) - .sort((a, b) => a - b); + .sort((a, b) => a.limit - b.limit); if (!limits.length) { return null; @@ -164,9 +177,9 @@ export const InformationComponent: FC<{ // Find the smallest limit that hasn't been exceeded yet // If all are exceeded, show the smallest one - const validLimit = limits.find((limit) => totalChars <= limit); + const validLimit = limits.find((item) => item.count <= item.limit); return validLimit ?? limits[0]; - }, [isGlobal, selectedIntegrations, chars, isInternal, totalChars]); + }, [isGlobal, selectedIntegrations, chars, isInternal, countFor]); return (
- {totalChars}/{totalAllowedChars} + {currentChars}/{totalAllowedChars}
)} {isGlobal && globalDisplayLimit !== null && (
- {totalChars}/{globalDisplayLimit} + {globalDisplayLimit.count}/{globalDisplayLimit.limit}
)} {((isGlobal && selectedIntegrations.length) || !isValid) && ( @@ -237,7 +250,8 @@ export const InformationComponent: FC<{ 'whitespace-nowrap', isInternal?.[index] ? '' - : totalChars > (chars?.[p.integration.id] || 0) + : countFor(p.integration.identifier) > + (chars?.[p.integration.id] || 0) ? 'text-[#FF3F3F]' : '' )} @@ -250,14 +264,17 @@ export const InformationComponent: FC<{ 'whitespace-nowrap', isInternal?.[index] ? '' - : totalChars > (chars?.[p.integration.id] || 0) + : countFor(p.integration.identifier) > + (chars?.[p.integration.id] || 0) ? 'text-[#FF3F3F]' : '' )} > {isInternal?.[index] ? t('internal_edit', 'Internal Edit') - : `${totalChars}/${chars?.[p.integration.id] || 0}`} + : `${countFor(p.integration.identifier)}/${ + chars?.[p.integration.id] || 0 + }`} ))} diff --git a/libraries/helpers/src/utils/count.length.ts b/libraries/helpers/src/utils/count.length.ts index 4a97255f53..d44dca1b91 100644 --- a/libraries/helpers/src/utils/count.length.ts +++ b/libraries/helpers/src/utils/count.length.ts @@ -37,3 +37,15 @@ export const textSlicer = ( export const weightedLength = (text: string): number => { return twitter.parseTweet(text).weightedLength; }; + +export const countLength = (integrationType: string, text: string): number => { + if (integrationType === 'x') { + return weightedLength(text); + } + + if (integrationType === 'threads') { + return new TextEncoder().encode(text).length; + } + + return text.length; +}; diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 95277925dc..0bb6abd3c1 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -53,7 +53,7 @@ import { stripLinks } from '@gitroom/helpers/utils/strip.links'; import { validate } from 'class-validator'; import { plainToInstance } from 'class-transformer'; import { stripHtmlValidation } from '@gitroom/helpers/utils/strip.html.validation'; -import { weightedLength } from '@gitroom/helpers/utils/count.length'; +import { countLength } from '@gitroom/helpers/utils/count.length'; type PostWithConditionals = Post & { integration?: Integration; @@ -827,20 +827,17 @@ export class PostsService { } const maximumCharacters = provider.maxLength(additionalSettings, settings); - const isX = integration.providerIdentifier === 'x'; const emptyContent = (post.value || []).some((a) => { const strip = stripHtmlValidation('normal', a.content || '', true); - const length = isX ? weightedLength(strip) : strip.length; + const length = countLength(integration.providerIdentifier, strip); return length === 0 && (a.image || []).length === 0; }); const tooLong = (post.value || []).some((a) => { const strip = stripHtmlValidation('normal', a.content || '', true); - const weighted = isX ? weightedLength(strip) : strip.length; - const totalCharacters = - weighted > strip.length ? weighted : strip.length; - return totalCharacters > (maximumCharacters || 1000000); + const counted = countLength(integration.providerIdentifier, strip); + return counted > (maximumCharacters || 1000000); }); return { From d0c5d7c8369f8e3ba788e2801cc505d7243962c8 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 31 Aug 2026 17:49:13 +0700 Subject: [PATCH 13/61] feat(admin-stats): active orgs per post creation source Adds activeOrgsBySource to /admin/stats (distinct orgs with a QUEUE, PUBLISHED or ERROR post in the range, grouped by Post.creationMethod) and renders it as a summary card and table on the admin stats page. --- .../admin/admin-stats.component.tsx | 17 ++++++ .../admin-stats/admin-stats.repository.ts | 53 ++++++++++++++++--- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/components/admin/admin-stats.component.tsx b/apps/frontend/src/components/admin/admin-stats.component.tsx index 1b5a51659f..2673eaa3bd 100644 --- a/apps/frontend/src/components/admin/admin-stats.component.tsx +++ b/apps/frontend/src/components/admin/admin-stats.component.tsx @@ -27,6 +27,7 @@ interface StatsResponse { scheduledAccounts?: StatsBlock; publishingChannels?: StatsBlock; scheduledChannels?: StatsBlock; + activeOrgsBySource?: StatsBlock; } const isoDaysAgo = (days: number) => { @@ -280,6 +281,14 @@ export const AdminStatsComponent: FC = () => { /> )} + {data.activeOrgsBySource && ( +
+ +
+ )}
@@ -337,6 +346,14 @@ export const AdminStatsComponent: FC = () => { />
)} + {data.activeOrgsBySource && ( +
+ +
+ )} )} diff --git a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts index 7e875f213f..160825a525 100644 --- a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts @@ -27,6 +27,7 @@ export interface StatsResponse { scheduledAccounts: { total: number; perSocial: PerSocial[] }; publishingChannels: { total: number; perSocial: PerSocial[] }; scheduledChannels: { total: number; perSocial: PerSocial[] }; + activeOrgsBySource: { total: number; perSocial: PerSocial[] }; } const sortDesc = (list: PerSocial[]) => @@ -212,6 +213,43 @@ export class AdminStatsRepository { }; } + // Distinct organizations with at least one top-level scheduled, published + // or failed post in the range, per creation source (web, API, MCP, ...). + // The total is distinct across all sources combined, not a summation. + private async sourceStats(params: StatsParams) { + const where: Prisma.PostWhereInput = { + parentPostId: null, + deletedAt: null, + publishDate: { gte: params.from, lte: params.to }, + state: { in: ['QUEUE', 'PUBLISHED', 'ERROR'] }, + }; + + const groups = await this._post.model.post.groupBy({ + by: ['organizationId', 'creationMethod'], + where, + }); + + const allOrgs = new Set(); + const orgsBySource = new Map>(); + for (const g of groups) { + if (!orgsBySource.has(g.creationMethod)) { + orgsBySource.set(g.creationMethod, new Set()); + } + orgsBySource.get(g.creationMethod)!.add(g.organizationId); + allOrgs.add(g.organizationId); + } + + return { + total: allOrgs.size, + perSocial: sortDesc( + [...orgsBySource.entries()].map(([provider, orgs]) => ({ + provider, + count: orgs.size, + })) + ), + }; + } + private async connectedStats(params: StatsParams) { const where: Prisma.IntegrationWhereInput = { deletedAt: null, @@ -239,12 +277,14 @@ export class AdminStatsRepository { } async getStats(params: StatsParams): Promise { - const [errors, posts, accounts, connected] = await Promise.all([ - this.errorStats(params), - this.postStats(params), - this.accountStats(params), - this.connectedStats(params), - ]); + const [errors, posts, accounts, connected, activeOrgsBySource] = + await Promise.all([ + this.errorStats(params), + this.postStats(params), + this.accountStats(params), + this.connectedStats(params), + this.sourceStats(params), + ]); return { from: params.from.toISOString(), @@ -256,6 +296,7 @@ export class AdminStatsRepository { scheduledAccounts: accounts.scheduledAccounts, publishingChannels: accounts.publishingChannels, scheduledChannels: accounts.scheduledChannels, + activeOrgsBySource, }; } } From 3cbe20b86bf3b2243843d51bb63dcec8773babf7 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Sat, 12 Sep 2026 15:00:18 +0700 Subject: [PATCH 14/61] feat: wallet rejection --- .../components/auth/providers/wallet.provider.tsx | 4 +++- .../src/sentry/initialize.sentry.next.basic.ts | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/components/auth/providers/wallet.provider.tsx b/apps/frontend/src/components/auth/providers/wallet.provider.tsx index 83585dde56..71000ce65c 100644 --- a/apps/frontend/src/components/auth/providers/wallet.provider.tsx +++ b/apps/frontend/src/components/auth/providers/wallet.provider.tsx @@ -166,7 +166,9 @@ const InnerWallet = () => { }) .catch(() => { wallet.select(null); - wallet.disconnect(); + wallet.disconnect().catch(() => { + /** empty */ + }); }); } if (buttonState === 'connected') { diff --git a/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts b/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts index ef267949c7..9db747add9 100644 --- a/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts +++ b/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts @@ -12,8 +12,19 @@ export const initializeSentryBasic = (environment: string, dsn: string, extensio /^Load failed .*/i, /^NetworkError when attempting to fetch resource\.$/i, /^NetworkError when attempting to fetch resource\. .*/i, + /^Object captured as promise rejection with keys: code, message$/i, ]; + // Browser wallet extensions (Phantom, MetaMask, etc.) reject with a plain + // { code, message } object instead of an Error when the user closes their popup. + // Those rejections happen inside the extension's injected script, not in our code. + const isWalletExtensionRejection = (exception: unknown) => + !!exception && + typeof exception === 'object' && + !(exception instanceof Error) && + 'code' in exception && + 'message' in exception; + try { Sentry.init({ initialScope: { @@ -41,6 +52,10 @@ export const initializeSentryBasic = (environment: string, dsn: string, extensio tracesSampleRate: 1.0, beforeSend(event, hint) { + if (isWalletExtensionRejection(hint?.originalException)) { + return null; // Ignore the event + } + if (event.exception && event.exception.values) { for (const exception of event.exception.values) { if (exception.value) { From 2c2f788e1262fff1d13d0cf76bb9b51c0747b01d Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 14 Sep 2026 20:47:22 +0700 Subject: [PATCH 15/61] feat(farcaster): migrate from SIWN to Neynar managed signers, fix login state Neynar retired Sign In With Neynar, so the hosted popup used for Farcaster login and channel connect no longer completes. Replace it with Neynar managed signers: the backend creates a signer, signs the EIP-712 signed key request with the app custody mnemonic (viem), registers it with Neynar and renders the approval deep link as a QR (qrcode) since the link is a bare 302 to the farcaster:// scheme. The frontend polls the new public /auth/farcaster/signer routes and builds the same base64 blob the popup produced, so authenticate(), the auth provider, the stored token format and existing users/channels are unchanged. @neynar/react is removed. Also thread the oauth_state nonce through the Farcaster login button: since the Apple login change, checkExists rejects logins without a matching state cookie, which broke Farcaster login independently of the SIWN retirement. New env vars: NEYNAR_APP_FID, NEYNAR_APP_MNEMONIC, NEYNAR_SPONSOR_SIGNERS. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01R8gvBNgPqqayC9zGPB5R5a --- .env.example | 6 + .../backend/src/api/routes/auth.controller.ts | 19 ++ .../auth/providers/farcaster.provider.ts | 6 +- .../components/auth/nayner.auth.button.tsx | 85 -------- .../auth/providers/farcaster.provider.tsx | 196 ++++++++++++++---- .../web3/providers/telegram.provider.tsx | 1 - .../web3/providers/wrapcaster.provider.tsx | 14 +- i18n.lock | 28 +++ .../integrations/social/farcaster.provider.ts | 85 ++++++++ .../translation/locales/ar/translation.json | 28 +++ .../translation/locales/bn/translation.json | 28 +++ .../translation/locales/de/translation.json | 28 +++ .../translation/locales/en/translation.json | 6 + .../translation/locales/es/translation.json | 28 +++ .../translation/locales/fr/translation.json | 28 +++ .../translation/locales/he/translation.json | 28 +++ .../translation/locales/it/translation.json | 28 +++ .../translation/locales/ja/translation.json | 28 +++ .../translation/locales/ko/translation.json | 28 +++ .../translation/locales/pt/translation.json | 28 +++ .../translation/locales/ru/translation.json | 28 +++ .../translation/locales/tr/translation.json | 28 +++ .../translation/locales/vi/translation.json | 28 +++ .../translation/locales/zh/translation.json | 28 +++ package.json | 3 +- pnpm-lock.yaml | 126 ++--------- 26 files changed, 715 insertions(+), 252 deletions(-) delete mode 100644 apps/frontend/src/components/auth/nayner.auth.button.tsx diff --git a/.env.example b/.env.example index cd8c85c7c6..dd83c15a5b 100644 --- a/.env.example +++ b/.env.example @@ -63,6 +63,12 @@ APPLE_CLIENT_ID="" APPLE_TEAM_ID="" APPLE_KEY_ID="" APPLE_PRIVATE_KEY="" +# --- Sign in with Farcaster (Neynar) +#NEYNAR_CLIENT_ID="" # still gates the Farcaster login button in the UI +#NEYNAR_SECRET_KEY="" +#NEYNAR_APP_FID="" # Farcaster id of the account that represents your app (the one users see requesting access) +#NEYNAR_APP_MNEMONIC="" # recovery phrase of that account's custody wallet, used only to sign managed-signer key requests +#NEYNAR_SPONSOR_SIGNERS="false" # "true" lets Neynar pay the on-chain signer fee (billed to your Neynar credits); otherwise the user pays in Warpcast BEEHIIVE_API_KEY="" BEEHIIVE_PUBLICATION_ID="" LISTMONK_DOMAIN="" diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index 2ed4482447..db6b647391 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -24,6 +24,7 @@ import { UserAgent } from '@gitroom/nestjs-libraries/user/user.agent'; import { Provider } from '@prisma/client'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import * as Sentry from '@sentry/nestjs'; +import { FarcasterProvider } from '@gitroom/nestjs-libraries/integrations/social/farcaster.provider'; @ApiTags('Auth') @Controller('/auth') @@ -285,6 +286,24 @@ export class AuthController { } } + @Post('/farcaster/signer') + async farcasterSigner() { + try { + return await new FarcasterProvider().createSigner(); + } catch (err: any) { + return { error: err.message || 'Failed to create signer' }; + } + } + + @Get('/farcaster/signer') + async farcasterSignerStatus(@Query('signerUuid') signerUuid: string) { + try { + return await new FarcasterProvider().signerStatus(signerUuid); + } catch (err: any) { + return { error: err.message || 'Failed to check signer' }; + } + } + @Post('/oauth/:provider/redirect') oauthRedirect( @Param('provider') provider: string, diff --git a/apps/backend/src/services/auth/providers/farcaster.provider.ts b/apps/backend/src/services/auth/providers/farcaster.provider.ts index 8d66631680..d3c5675f03 100644 --- a/apps/backend/src/services/auth/providers/farcaster.provider.ts +++ b/apps/backend/src/services/auth/providers/farcaster.provider.ts @@ -10,8 +10,10 @@ const client = new NeynarAPIClient({ @AuthProvider({ provider: 'FARCASTER' }) export class FarcasterProvider extends AuthProviderAbstract { - generateLink() { - return ''; + // no OAuth redirect here, the frontend only needs the state nonce that + // pairs with the oauth_state cookie set by /auth/oauth/FARCASTER + generateLink(query?: { state?: string }) { + return query?.state || ''; } async getToken(code: string, _redirectUri?: string) { diff --git a/apps/frontend/src/components/auth/nayner.auth.button.tsx b/apps/frontend/src/components/auth/nayner.auth.button.tsx deleted file mode 100644 index da450b6df6..0000000000 --- a/apps/frontend/src/components/auth/nayner.auth.button.tsx +++ /dev/null @@ -1,85 +0,0 @@ -'use client'; - -import React, { - useCallback, - useEffect, - useState, - useRef, - FC, - ReactNode, -} from 'react'; -import { useNeynarContext } from '@neynar/react'; -export const NeynarAuthButton: FC<{ - children: ReactNode; - onLogin: (code: string) => void; -}> = (props) => { - const { children, onLogin } = props; - const { client_id } = useNeynarContext(); - const [showModal, setShowModal] = useState(false); - const authWindowRef = useRef(null); - const neynarLoginUrl = `${ - process.env.NEYNAR_LOGIN_URL ?? 'https://app.neynar.com/login' - }?client_id=${client_id}`; - const authOrigin = new URL(neynarLoginUrl).origin; - const modalRef = useRef(null); - const handleMessage = useCallback( - async (event: MessageEvent) => { - if ( - event.origin === authOrigin && - event.data && - event.data.is_authenticated - ) { - authWindowRef.current?.close(); - window.removeEventListener('message', handleMessage); // Remove listener here - delete event.data.user.profile; - const _user = { - signer_uuid: event.data.signer_uuid, - ...event.data.user, - }; - onLogin(Buffer.from(JSON.stringify(_user)).toString('base64')); - } - }, - [client_id, onLogin] - ); - const handleSignIn = useCallback(() => { - const width = 600, - height = 700; - const left = window.screen.width / 2 - width / 2; - const top = window.screen.height / 2 - height / 2; - const windowFeatures = `width=${width},height=${height},top=${top},left=${left}`; - authWindowRef.current = window.open( - neynarLoginUrl, - '_blank', - windowFeatures - ); - if (!authWindowRef.current) { - console.error( - 'Failed to open the authentication window. Please check your pop-up blocker settings.' - ); - return; - } - window.addEventListener('message', handleMessage, false); - }, [client_id, handleMessage]); - const closeModal = () => setShowModal(false); - useEffect(() => { - return () => { - window.removeEventListener('message', handleMessage); // Cleanup function to remove listener - }; - }, [handleMessage]); - const handleOutsideClick = useCallback((event: any) => { - if (modalRef.current && !modalRef.current.contains(event.target)) { - closeModal(); - } - }, []); - useEffect(() => { - if (showModal) { - document.addEventListener('mousedown', handleOutsideClick); - } else { - document.removeEventListener('mousedown', handleOutsideClick); - } - return () => { - document.removeEventListener('mousedown', handleOutsideClick); - }; - }, [showModal, handleOutsideClick]); - return
{children}
; -}; diff --git a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx index 683b67e224..2fbc24a369 100644 --- a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx +++ b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx @@ -1,13 +1,16 @@ 'use client'; -import { FC, useCallback } from 'react'; -import { useVariables } from '@gitroom/react/helpers/variable.context'; -import { NeynarContextProvider, Theme, useNeynarContext } from '@neynar/react'; -import { NeynarAuthButton } from '@gitroom/frontend/components/auth/nayner.auth.button'; +import { FC, useCallback, useEffect, useRef, useState } from 'react'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { timer } from '@gitroom/helpers/utils/timer'; +import { useToaster } from '@gitroom/react/toaster/toaster'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; +import Loading from '@gitroom/frontend/components/layout/loading'; export const FarcasterProvider = () => { + const fetch = useFetch(); const gotoLogin = useCallback(async (code: string) => { - window.location.href = `/auth?provider=FARCASTER&code=${code}`; + const state = await (await fetch('/auth/oauth/FARCASTER')).text(); + window.location.href = `/auth?provider=FARCASTER&code=${code}&state=${state}`; }, []); return ; }; @@ -15,45 +18,154 @@ export const ButtonCaster: FC<{ login: (code: string) => void; }> = (props) => { const { login } = props; - const { neynarClientId } = useVariables(); + const fetch = useFetch(); + const toaster = useToaster(); const t = useT(); - return ( - - -
{ + stop.current = false; + const startedAt = Date.now(); + const generator = load(signerUuid); + for await (const data of generator) { + if (stop.current) { + return; + } + if (data.status === 'approved') { + login(data.code); + return; + } + if (data.status === 'revoked') { + toaster.show( + t( + 'farcaster_signer_revoked', + 'The Farcaster approval was revoked, please try again' + ), + 'warning' + ); + setApprovalUrl(''); + return; + } + if (Date.now() - startedAt > 10 * 60 * 1000) { + toaster.show( + t( + 'farcaster_approval_timeout', + 'Farcaster approval timed out, please try again' + ), + 'warning' + ); + setApprovalUrl(''); + return; + } + await timer(2000); + } + }; + + const start = useCallback(async () => { + // opened synchronously on click so popup blockers allow it + const approvalWindow = window.open('', '_blank'); + try { + const data = await ( + await fetch('/auth/farcaster/signer', { method: 'POST' }) + ).json(); + if (data.error) { + approvalWindow?.close(); + toaster.show(data.error, 'warning'); + return; + } + setApprovalUrl(data.approvalUrl); + setQrCode(data.qrCode); + if (approvalWindow) { + approvalWindow.location.href = data.approvalUrl; + } + poll(data.signerUuid); + } catch (err) { + approvalWindow?.close(); + toaster.show( + t('farcaster_signer_failed', 'Failed to start the Farcaster connection'), + 'warning' + ); + } + }, []); + + useEffect(() => { + return () => { + stop.current = true; + }; + }, []); + + if (approvalUrl) { + return ( +
+ +
+ {t( + 'farcaster_approve_instructions', + 'Scan the QR code with your phone, or open the link on your phone, then approve Postiz in the Farcaster app.' + )} +
+ - - - - - - - - - - - -
{t('farcaster', 'Farcaster')}
+ {t('farcaster_open_in_farcaster', 'Open in Farcaster')} +
+
+ + {t('farcaster_waiting_for_approval', 'Waiting for your approval...')}
- - +
+ ); + } + + return ( +
+ + + + + + + + + + + +
{t('farcaster', 'Farcaster')}
+
); }; diff --git a/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx b/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx index 8ade765367..94f77a5703 100644 --- a/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx +++ b/apps/frontend/src/components/launches/web3/providers/telegram.provider.tsx @@ -1,6 +1,5 @@ 'use client'; -import '@neynar/react/dist/style.css'; import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import { Web3ProviderInterface } from '@gitroom/frontend/components/launches/web3/web3.provider.interface'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; diff --git a/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx b/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx index c3814ac9cd..26b79fc32b 100644 --- a/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx +++ b/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx @@ -1,23 +1,11 @@ 'use client'; -import '@neynar/react/dist/style.css'; -import React, { FC, useMemo, useState, useCallback, useEffect } from 'react'; +import React, { FC, useState, useCallback } from 'react'; import { Web3ProviderInterface } from '@gitroom/frontend/components/launches/web3/web3.provider.interface'; -import { useVariables } from '@gitroom/react/helpers/variable.context'; -import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component'; -import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; -import { - NeynarAuthButton, - NeynarContextProvider, - Theme, - useNeynarContext, -} from '@neynar/react'; -import { INeynarAuthenticatedUser } from '@neynar/react/dist/types/common'; import { ButtonCaster } from '@gitroom/frontend/components/auth/providers/farcaster.provider'; export const WrapcasterProvider: FC = (props) => { const [_, state] = props.nonce.split('||'); - const modal = useModals(); const [hide, setHide] = useState(false); const auth = useCallback( (code: string) => { diff --git a/i18n.lock b/i18n.lock index 8d227e15b8..f2d736216a 100644 --- a/i18n.lock +++ b/i18n.lock @@ -579,7 +579,14 @@ checksums: email_address: 0ee22bbbe989a0c61a18023407d12dc2 email_already_exists: ad25f0ca7a16c0d37e566a9c090a0fd2 google: 6cc462fb53d90d404f48d5a6695c1de1 + apple: 4e2ced07ca66bd1cf0562882d019aff2 farcaster: b09af25fcb497663e8594b9fc514b969 + farcaster_approve_instructions: 97061425f4de396ed7fdbca1f59fe702 + farcaster_open_in_farcaster: cc32bd29fef8129fbd9a30385b163c49 + farcaster_waiting_for_approval: 2ee1cd6c0ff8d0db1a4924c08b80e498 + farcaster_signer_revoked: 0eff3e12951a952f8db78f54be25cf2d + farcaster_signer_failed: d3274186449d73fb6ffb37b2f47bb9d4 + farcaster_approval_timeout: 2a434e0962661820d56dba28a88ec18d edit_autopost: 2cde36144cddda0acc069e6913e095f9 add_autopost_title: d018d5d12c9f41c0b610da4b101d77e9 webhook_deleted_successfully: fcefd247ec76a372002d2cffac3c5b0f @@ -697,10 +704,31 @@ checksums: connected_channels: b64d400364bb3ccb4b1d4b547673f4c3 continue: 3cfba90b4600131e82fc4260c568d044 continue_without_channels: fa9c2e19c59e2eac86c1fcac35611337 + connect_agents: 3272e6e7b043cd9bd5626dc57892b4b2 + connect_your_ai_agent: 29cfdf27911e816ade81f5dc3ba948eb + connect_agent_description: 087b814876d35ea71d2f63d54cc39788 + agent_access_unavailable: 80a529742f86d7cacb9bb44d5e06be04 + sign_in_no_api_key: b17680d7465d120632114d25217e0e2e + oauth_sign_in_hint: 92797174fbc54b56b7c81f485dc9008b + add_to_cursor: da1a4472a29f82361b48e26842c05a0e + cli: 6bfaaf925aa1c902820f2059a234e467 + other_agents: e85458e10eb4bd29157a1f77568a3845 + documentation: 1563fcb5ddb5037b0709ccd3dd384a92 + read_the_api_docs: 016e8f560539f8c57727cab2b2e4fc1d + api_key_onboarding_description: 426162950cd838b5ebd90d22151ae4b0 + api_onboarding_description: 97cc31ad6bfe6ef3f479e72987ea69a4 + chat: 1171b63c16b3431dca319af1804de2a0 + chat_onboarding_description: 9da74037342cd6adb283e8205299b986 + connector: 7abb5584501ce0e3cc51ba19f0561ca8 + connector_onboarding_description: eb8027296b46bf58475f6b4925bd6351 + mcp_onboarding_description: 5b33036d174222d86ac50039a3a31724 + cli_onboarding_description: b4aba065e5a8410ee2c365ee4d7aa87c + agent_settings_later: bbdd45a80cc5218809363348e0b03a32 watch_tutorial: 7f202b82c805285109187f099d22e863 watch_tutorial_title: c3c0d814f10a3325a7fd52a7fb44ae38 watch_tutorial_description: 25dd65235d9603f6d65d62f953791722 back: f541015a827e37cb3b1234e56bc2aa3c + continue_skip: 82edfa21507a88b8788d33cc632d64af get_started: 1d5f030c4ec9c869e647ae060518b948 kick_select_channel: 13fa95c439addeb6674e571e37c96b79 annual: 5d4f1c56f4e9e579ec9967ca68cc64ac diff --git a/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts b/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts index 0e237c4015..c61a265ce4 100644 --- a/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/farcaster.provider.ts @@ -15,11 +15,26 @@ import { Integration } from '@prisma/client'; import { FarcasterDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/farcaster.dto'; import { Tool } from '@gitroom/nestjs-libraries/integrations/tool.decorator'; import { Rules } from '@gitroom/nestjs-libraries/chat/rules.description.decorator'; +import { mnemonicToAccount } from 'viem/accounts'; +import { toDataURL } from 'qrcode'; const client = new NeynarAPIClient({ apiKey: process.env.NEYNAR_SECRET_KEY || '00000000-000-0000-000-000000000000', }); +const SIGNED_KEY_REQUEST_VALIDATOR_EIP_712_DOMAIN = { + name: 'Farcaster SignedKeyRequestValidator', + version: '1', + chainId: 10, + verifyingContract: '0x00000000fc700472606ed4fa22623acf62c60553', +} as const; + +const SIGNED_KEY_REQUEST_TYPE = [ + { name: 'requestFid', type: 'uint256' }, + { name: 'key', type: 'bytes' }, + { name: 'deadline', type: 'uint256' }, +] as const; + @Rules( 'Farcaster/Warpcast can only accept pictures' ) @@ -73,6 +88,76 @@ export class FarcasterProvider }; } + async createSigner(): Promise<{ + signerUuid: string; + approvalUrl: string; + qrCode: string; + }> { + if (!process.env.NEYNAR_APP_FID || !process.env.NEYNAR_APP_MNEMONIC) { + throw new Error( + 'Farcaster is not configured: set NEYNAR_APP_FID and NEYNAR_APP_MNEMONIC' + ); + } + + const appFid = Number(process.env.NEYNAR_APP_FID); + const signer = await client.createSigner(); + const deadline = Math.floor(Date.now() / 1000) + 24 * 60 * 60; + const signature = await mnemonicToAccount( + process.env.NEYNAR_APP_MNEMONIC + ).signTypedData({ + domain: SIGNED_KEY_REQUEST_VALIDATOR_EIP_712_DOMAIN, + types: { SignedKeyRequest: SIGNED_KEY_REQUEST_TYPE }, + primaryType: 'SignedKeyRequest', + message: { + requestFid: BigInt(appFid), + key: signer.public_key as `0x${string}`, + deadline: BigInt(deadline), + }, + }); + + const registered = await client.registerSignedKey({ + signerUuid: signer.signer_uuid, + appFid, + deadline, + signature, + ...(process.env.NEYNAR_SPONSOR_SIGNERS === 'true' + ? { sponsor: { sponsored_by_neynar: true } } + : {}), + }); + + return { + signerUuid: registered.signer_uuid, + approvalUrl: registered.signer_approval_url!, + qrCode: await toDataURL(registered.signer_approval_url!), + }; + } + + async signerStatus( + signerUuid: string + ): Promise<{ status: string; code?: string }> { + const signer = await client.lookupSigner({ signerUuid }); + if (signer.status !== 'approved') { + return { status: signer.status }; + } + + const { + users: [user], + } = await client.fetchBulkUsers({ fids: [signer.fid!] }); + + return { + status: signer.status, + code: Buffer.from( + JSON.stringify({ + signer_uuid: signerUuid, + fid: signer.fid, + username: user.username, + display_name: user.display_name, + pfp_url: user.pfp_url, + }) + ).toString('base64'), + }; + } + async authenticate(params: { code: string; codeVerifier: string; diff --git a/libraries/react-shared-libraries/src/translation/locales/ar/translation.json b/libraries/react-shared-libraries/src/translation/locales/ar/translation.json index a5008647fa..912a66eacb 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ar/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ar/translation.json @@ -575,7 +575,14 @@ "email_address": "عنوان البريد الإلكتروني", "email_already_exists": "البريد الإلكتروني موجود بالفعل", "google": "جوجل", + "apple": "تفاحة", "farcaster": "فاركاستر", + "farcaster_approve_instructions": "امسح رمز الاستجابة السريعة (QR) بهاتفك، أو افتح الرابط على هاتفك، ثم وافق على Postiz في تطبيق Farcaster.", + "farcaster_open_in_farcaster": "افتح في Farcaster", + "farcaster_waiting_for_approval": "بانتظار موافقتك...", + "farcaster_signer_revoked": "تم إلغاء موافقة Farcaster، يرجى المحاولة مرة أخرى", + "farcaster_signer_failed": "فشل بدء الاتصال بـ Farcaster", + "farcaster_approval_timeout": "انتهت مهلة موافقة Farcaster، يرجى المحاولة مرة أخرى", "edit_autopost": "تعديل النشر التلقائي", "add_autopost_title": "إضافة نشر تلقائي", "webhook_deleted_successfully": "تم حذف الويب هوك بنجاح", @@ -693,10 +700,31 @@ "connected_channels": "القنوات المتصلة", "continue": "متابعة", "continue_without_channels": "متابعة بدون قنوات", + "connect_agents": "ربط الوكلاء", + "connect_your_ai_agent": "اربط وكيل الذكاء الاصطناعي الخاص بك", + "connect_agent_description": "اختر الوكيل الذي تستخدمه ودعه ينشئ وجدول المنشورات نيابة عنك", + "agent_access_unavailable": "الوصول إلى الوكيل غير متاح في خطتك الحالية أو دورك. يمكنك إعداده لاحقًا من الإعدادات > المطورون.", + "sign_in_no_api_key": "تسجيل الدخول مع Postiz (بدون مفتاح API)", + "oauth_sign_in_hint": "سيفتح وكيلك نافذة متصفح لتسجيل الدخول إلى Postiz.", + "add_to_cursor": "أضف إلى المؤشر", + "cli": "CLI", + "other_agents": "وكلاء آخرون", + "documentation": "التوثيق", + "read_the_api_docs": "اقرأ مستندات واجهة برمجة التطبيقات", + "api_key_onboarding_description": "أرسلها كـ Authorization header في كل طلب", + "api_onboarding_description": "استخدم واجهة برمجة تطبيقات Postiz من كودك الخاص، n8n أو أي أتمتة أخرى", + "chat": "الدردشة", + "chat_onboarding_description": "لا حاجة لإعدادات MCP أو CLI. الصق هذا في الدردشة، سيقوم الوكيل بتثبيت Postiz CLI ويطلب منك مفتاح API الخاص بك.", + "connector": "موصل", + "connector_onboarding_description": "الأسرع: أضف Postiz بنقرة واحدة، سيطلب منك تسجيل الدخول", + "mcp_onboarding_description": "زود وكيلك بأدوات Postiz لإنشاء وجدولة وإدارة المنشورات", + "cli_onboarding_description": "ثبّت Postiz CLI والمهارة التي تعلم وكيلك كيفية استخدامها", + "agent_settings_later": "المزيد من الوكلاء والتعليمات الكاملة متوفرة في الإعدادات > المطورون", "watch_tutorial": "مشاهدة الدليل", "watch_tutorial_title": "تعلم كيفية استخدام Postiz", "watch_tutorial_description": "شاهد هذا الفيديو القصير لتتعلم كيف تستفيد من Postiz بأفضل شكل", "back": "رجوع", + "continue_skip": "متابعة / تخطي", "get_started": "ابدأ", "kick_select_channel": "اختر القناة", "annual": "سنوي", diff --git a/libraries/react-shared-libraries/src/translation/locales/bn/translation.json b/libraries/react-shared-libraries/src/translation/locales/bn/translation.json index 2747b13b45..7ec2e9cb56 100644 --- a/libraries/react-shared-libraries/src/translation/locales/bn/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/bn/translation.json @@ -575,7 +575,14 @@ "email_address": "ইমেইল ঠিকানা", "email_already_exists": "ইমেইল ইতিমধ্যে বিদ্যমান", "google": "গুগল", + "apple": "আপেল", "farcaster": "ফারকাস্টার", + "farcaster_approve_instructions": "আপনার ফোন দিয়ে QR কোডটি স্ক্যান করুন অথবা লিঙ্কটি ফোনে খুলুন, তারপর Farcaster অ্যাপে Postiz অনুমোদন করুন।", + "farcaster_open_in_farcaster": "Farcaster-এ খুলুন", + "farcaster_waiting_for_approval": "আপনার অনুমোদনের জন্য অপেক্ষা করা হচ্ছে...", + "farcaster_signer_revoked": "Farcaster অনুমোদন বাতিল করা হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন", + "farcaster_signer_failed": "Farcaster সংযোগ শুরু করতে ব্যর্থ হয়েছে", + "farcaster_approval_timeout": "Farcaster অনুমোদন সময় শেষ হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন", "edit_autopost": "অটোপোস্ট সম্পাদনা করুন", "add_autopost_title": "অটোপোস্ট যোগ করুন", "webhook_deleted_successfully": "ওয়েবহুক সফলভাবে মুছে ফেলা হয়েছে", @@ -693,10 +700,31 @@ "connected_channels": "সংযুক্ত চ্যানেলসমূহ", "continue": "চালিয়ে যান", "continue_without_channels": "চ্যানেল ছাড়াই চালিয়ে যান", + "connect_agents": "এজেন্ট সংযুক্ত করুন", + "connect_your_ai_agent": "আপনার AI এজেন্ট সংযুক্ত করুন", + "connect_agent_description": "আপনার ব্যবহৃত এজেন্টটি নির্বাচন করুন এবং তাকে পোস্ট তৈরি ও নির্ধারিত করতে দিন", + "agent_access_unavailable": "আপনার বর্তমান প্ল্যান বা ভূমিকার জন্য এজেন্ট অ্যাক্সেস উপলব্ধ নয়। আপনি পরে সেটিংস > ডেভেলপারস-এ সেট আপ করতে পারেন।", + "sign_in_no_api_key": "Postiz-এ সাইন ইন করুন (কোনো API কী ছাড়াই)", + "oauth_sign_in_hint": "আপনার এজেন্ট Postiz-এ সাইন ইন করার জন্য একটি ব্রাউজার উইন্ডো খুলবে।", + "add_to_cursor": "কার্সারে যোগ করুন", + "cli": "CLI", + "other_agents": "অন্যান্য এজেন্ট", + "documentation": "ডকুমেন্টেশন", + "read_the_api_docs": "API ডকুমেন্টেশন পড়ুন", + "api_key_onboarding_description": "প্রত্যেক অনুরোধের সাথে এটিকে Authorization হেডার হিসেবে পাঠান", + "api_onboarding_description": "নিজের কোড, n8n বা অন্য কোনো অটোমেশনের মাধ্যমে Postiz API ব্যবহার করুন", + "chat": "চ্যাট", + "chat_onboarding_description": "MCP বা CLI সেটিংসের প্রয়োজন নেই। এটি চ্যাটে পেস্ট করুন, এজেন্টটি Postiz CLI ইনস্টল করবে এবং আপনার API কী চাইবে।", + "connector": "কনেক্টর", + "connector_onboarding_description": "সবচেয়ে দ্রুত উপায়: এক ক্লিকে Postiz যোগ করুন, আপনাকে সাইন ইন করতে বলা হবে", + "mcp_onboarding_description": "আপনার এজেন্টকে Postiz টুল দিন যাতে সে পোস্ট তৈরি, নির্ধারণ এবং পরিচালনা করতে পারে", + "cli_onboarding_description": "Postiz CLI এবং সেই স্কিল ইনস্টল করুন যা আপনার এজেন্টকে এটি ব্যবহার করতে শেখায়", + "agent_settings_later": "আরও এজেন্ট এবং সম্পূর্ণ নির্দেশিকা সেটিংস > ডেভেলপারস-এ পাওয়া যাবে", "watch_tutorial": "টিউটোরিয়াল দেখুন", "watch_tutorial_title": "Postiz ব্যবহারের উপায় শিখুন", "watch_tutorial_description": "Postiz সর্বোচ্চভাবে কাজে লাগাতে এই সংক্ষিপ্ত ভিডিওটি দেখুন", "back": "পেছনে যান", + "continue_skip": "চালিয়ে যান / বাদ দিন", "get_started": "শুরু করুন", "kick_select_channel": "চ্যানেল নির্বাচন করুন", "annual": "বার্ষিক", diff --git a/libraries/react-shared-libraries/src/translation/locales/de/translation.json b/libraries/react-shared-libraries/src/translation/locales/de/translation.json index 38203a66be..032720140f 100644 --- a/libraries/react-shared-libraries/src/translation/locales/de/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/de/translation.json @@ -575,7 +575,14 @@ "email_address": "E-Mail-Adresse", "email_already_exists": "E-Mail existiert bereits", "google": "Google", + "apple": "Apfel", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scanne den QR-Code mit deinem Handy oder öffne den Link auf deinem Handy und bestätige dann Postiz in der Farcaster-App.", + "farcaster_open_in_farcaster": "In Farcaster öffnen", + "farcaster_waiting_for_approval": "Warte auf deine Bestätigung...", + "farcaster_signer_revoked": "Die Farcaster-Bestätigung wurde widerrufen, bitte versuche es erneut.", + "farcaster_signer_failed": "Die Verbindung zu Farcaster konnte nicht gestartet werden.", + "farcaster_approval_timeout": "Zeitüberschreitung bei der Farcaster-Bestätigung, bitte versuche es erneut.", "edit_autopost": "Autopost bearbeiten", "add_autopost_title": "Autopost hinzufügen", "webhook_deleted_successfully": "Webhook erfolgreich gelöscht", @@ -693,10 +700,31 @@ "connected_channels": "Verbundene Kanäle", "continue": "Weiter", "continue_without_channels": "Ohne Kanäle fortfahren", + "connect_agents": "Agenten verbinden", + "connect_your_ai_agent": "Verbinde deinen KI-Agenten", + "connect_agent_description": "Wähle den Agenten, den du nutzt, damit er Beiträge für dich erstellen und planen kann.", + "agent_access_unavailable": "Agentenzugriff ist für deinen aktuellen Plan oder deine Rolle nicht verfügbar. Du kannst ihn später unter Einstellungen > Entwickler einrichten.", + "sign_in_no_api_key": "Mit Postiz anmelden (kein API-Schlüssel)", + "oauth_sign_in_hint": "Dein Agent öffnet ein Browserfenster, um sich bei Postiz anzumelden.", + "add_to_cursor": "Zum Cursor hinzufügen", + "cli": "CLI", + "other_agents": "Weitere Agenten", + "documentation": "Dokumentation", + "read_the_api_docs": "Lies die API-Dokumentation", + "api_key_onboarding_description": "Sende ihn bei jeder Anfrage als Authorization-Header mit.", + "api_onboarding_description": "Nutze die Postiz API aus deinem eigenen Code, n8n oder einer anderen Automatisierungslösung.", + "chat": "Chat", + "chat_onboarding_description": "Kein MCP oder CLI Setup nötig. Füge das in den Chat ein und der Agent installiert das Postiz CLI und fragt dich nach deinem API-Schlüssel.", + "connector": "Konnektor", + "connector_onboarding_description": "Am schnellsten: Füge Postiz mit einem Klick hinzu, du wirst zur Anmeldung aufgefordert.", + "mcp_onboarding_description": "Gib deinem Agenten Postiz-Tools, um Beiträge zu erstellen, zu planen und zu verwalten.", + "cli_onboarding_description": "Installiere das Postiz CLI und das Skill, das deinem Agenten beibringt, wie es zu nutzen ist.", + "agent_settings_later": "Weitere Agenten und vollständige Anweisungen findest du unter Einstellungen > Entwickler.", "watch_tutorial": "Tutorial ansehen", "watch_tutorial_title": "Lerne, wie du Postiz benutzt", "watch_tutorial_description": "Sieh dir dieses kurze Video an, um das Beste aus Postiz herauszuholen", "back": "Zurück", + "continue_skip": "Weiter / Überspringen", "get_started": "Loslegen", "kick_select_channel": "Kanal auswählen", "annual": "Jährlich", diff --git a/libraries/react-shared-libraries/src/translation/locales/en/translation.json b/libraries/react-shared-libraries/src/translation/locales/en/translation.json index 2d9252f525..7ba1cabf9c 100644 --- a/libraries/react-shared-libraries/src/translation/locales/en/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/en/translation.json @@ -578,6 +578,12 @@ "google": "Google", "apple": "Apple", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scan the QR code with your phone, or open the link on your phone, then approve Postiz in the Farcaster app.", + "farcaster_open_in_farcaster": "Open in Farcaster", + "farcaster_waiting_for_approval": "Waiting for your approval...", + "farcaster_signer_revoked": "The Farcaster approval was revoked, please try again", + "farcaster_signer_failed": "Failed to start the Farcaster connection", + "farcaster_approval_timeout": "Farcaster approval timed out, please try again", "edit_autopost": "Edit Autopost", "add_autopost_title": "Add Autopost", "webhook_deleted_successfully": "Webhook deleted successfully", diff --git a/libraries/react-shared-libraries/src/translation/locales/es/translation.json b/libraries/react-shared-libraries/src/translation/locales/es/translation.json index c8302a9601..e17bd83f36 100644 --- a/libraries/react-shared-libraries/src/translation/locales/es/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/es/translation.json @@ -575,7 +575,14 @@ "email_address": "Dirección de correo electrónico", "email_already_exists": "El correo electrónico ya existe", "google": "Google", + "apple": "Manzana", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Escanee el código QR con su teléfono o abra el enlace en su teléfono, luego apruebe Postiz en la app de Farcaster.", + "farcaster_open_in_farcaster": "Abrir en Farcaster", + "farcaster_waiting_for_approval": "Esperando su aprobación...", + "farcaster_signer_revoked": "La aprobación de Farcaster fue revocada, intente nuevamente", + "farcaster_signer_failed": "No se pudo iniciar la conexión con Farcaster", + "farcaster_approval_timeout": "El tiempo de aprobación de Farcaster se agotó, intente nuevamente", "edit_autopost": "Editar autopublicación", "add_autopost_title": "Agregar autopublicación", "webhook_deleted_successfully": "Webhook eliminado correctamente", @@ -693,10 +700,31 @@ "connected_channels": "Canales conectados", "continue": "Continuar", "continue_without_channels": "Continuar sin canales", + "connect_agents": "Conectar agentes", + "connect_your_ai_agent": "Conecta tu agente de IA", + "connect_agent_description": "Elige el agente que usas y deja que cree y programe publicaciones por ti", + "agent_access_unavailable": "El acceso del agente no está disponible para tu plan o rol actual. Puedes configurarlo más tarde en Configuración > Desarrolladores.", + "sign_in_no_api_key": "Inicia sesión con Postiz (sin clave API)", + "oauth_sign_in_hint": "Tu agente abrirá una ventana en el navegador para iniciar sesión en Postiz.", + "add_to_cursor": "Agregar al Cursor", + "cli": "CLI", + "other_agents": "Otros agentes", + "documentation": "Documentación", + "read_the_api_docs": "Lee la documentación del API", + "api_key_onboarding_description": "Envíala como el encabezado de Autorización en cada solicitud", + "api_onboarding_description": "Usa el API de Postiz desde tu propio código, n8n o cualquier otra automatización", + "chat": "Chat", + "chat_onboarding_description": "No necesitas configuraciones de MCP ni de CLI. Pega esto en el chat, el agente instalará el CLI de Postiz y te pedirá tu clave API.", + "connector": "Conector", + "connector_onboarding_description": "La forma más rápida: agrega Postiz con un clic, se te pedirá iniciar sesión", + "mcp_onboarding_description": "Dale a tu agente las herramientas de Postiz para crear, programar y gestionar publicaciones", + "cli_onboarding_description": "Instala el CLI de Postiz y la habilidad que enseña a tu agente cómo utilizarlo", + "agent_settings_later": "Más agentes y las instrucciones completas están disponibles en Configuración > Desarrolladores", "watch_tutorial": "Ver tutorial", "watch_tutorial_title": "Aprende a usar Postiz", "watch_tutorial_description": "Mira este breve video para aprender a sacar el máximo provecho de Postiz", "back": "Atrás", + "continue_skip": "Continuar / Omitir", "get_started": "Comenzar", "kick_select_channel": "Seleccionar canal", "annual": "Anual", diff --git a/libraries/react-shared-libraries/src/translation/locales/fr/translation.json b/libraries/react-shared-libraries/src/translation/locales/fr/translation.json index ebb0e8d479..e507cdb4cb 100644 --- a/libraries/react-shared-libraries/src/translation/locales/fr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/fr/translation.json @@ -575,7 +575,14 @@ "email_address": "Adresse e-mail", "email_already_exists": "L'adresse e-mail existe déjà", "google": "Google", + "apple": "Pomme", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scannez le code QR avec votre téléphone, ou ouvrez le lien sur votre téléphone, puis approuvez Postiz dans l’application Farcaster.", + "farcaster_open_in_farcaster": "Ouvrir dans Farcaster", + "farcaster_waiting_for_approval": "En attente de votre approbation...", + "farcaster_signer_revoked": "L’approbation Farcaster a été révoquée, veuillez réessayer", + "farcaster_signer_failed": "Échec de la connexion à Farcaster", + "farcaster_approval_timeout": "Le délai d’approbation Farcaster est dépassé, veuillez réessayer", "edit_autopost": "Modifier l'autopost", "add_autopost_title": "Ajouter un autopost", "webhook_deleted_successfully": "Webhook supprimé avec succès", @@ -693,10 +700,31 @@ "connected_channels": "Canaux connectés", "continue": "Continuer", "continue_without_channels": "Continuer sans canaux", + "connect_agents": "Connecter des agents", + "connect_your_ai_agent": "Connectez votre agent IA", + "connect_agent_description": "Choisissez l’agent que vous utilisez et laissez-le créer et programmer des publications pour vous", + "agent_access_unavailable": "L’accès agent n’est pas disponible pour votre plan ou votre rôle actuel. Vous pouvez le configurer plus tard dans Paramètres > Développeurs.", + "sign_in_no_api_key": "Se connecter avec Postiz (pas de clé API)", + "oauth_sign_in_hint": "Votre agent ouvrira une fenêtre de navigateur pour se connecter à Postiz.", + "add_to_cursor": "Ajouter au curseur", + "cli": "CLI", + "other_agents": "Autres agents", + "documentation": "Documentation", + "read_the_api_docs": "Lire la documentation de l’API", + "api_key_onboarding_description": "Envoyez-la en tant qu’en-tête Authorization à chaque requête", + "api_onboarding_description": "Utilisez l’API Postiz depuis votre propre code, n8n ou toute autre automatisation", + "chat": "Chat", + "chat_onboarding_description": "Aucun paramétrage MCP ou CLI nécessaire. Collez ceci dans le chat, l’agent installe le CLI Postiz et vous demande votre clé API.", + "connector": "Connecteur", + "connector_onboarding_description": "La façon la plus rapide : ajoutez Postiz en un clic, vous serez invité à vous connecter", + "mcp_onboarding_description": "Donnez à votre agent des outils Postiz pour créer, programmer et gérer des publications", + "cli_onboarding_description": "Installez le CLI Postiz et la compétence qui apprend à votre agent à l’utiliser", + "agent_settings_later": "Plus d’agents et les instructions complètes sont disponibles dans Paramètres > Développeurs", "watch_tutorial": "Regarder le tutoriel", "watch_tutorial_title": "Apprenez à utiliser Postiz", "watch_tutorial_description": "Regardez cette courte vidéo pour apprendre à tirer le meilleur parti de Postiz", "back": "Retour", + "continue_skip": "Continuer / Passer", "get_started": "Commencer", "kick_select_channel": "Sélectionner le canal", "annual": "Annuel", diff --git a/libraries/react-shared-libraries/src/translation/locales/he/translation.json b/libraries/react-shared-libraries/src/translation/locales/he/translation.json index 4b963c59e9..c042ebb7d8 100644 --- a/libraries/react-shared-libraries/src/translation/locales/he/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/he/translation.json @@ -575,7 +575,14 @@ "email_address": "כתובת אימייל", "email_already_exists": "האימייל כבר קיים", "google": "גוגל", + "apple": "תפוח", "farcaster": "Farcaster", + "farcaster_approve_instructions": "סרקו את קוד ה-QR עם הטלפון שלכם, או פתחו את הקישור בטלפון ואז אשרו את Postiz באפליקציית Farcaster.", + "farcaster_open_in_farcaster": "פתחו ב-Farcaster", + "farcaster_waiting_for_approval": "מחכים לאישור ממך...", + "farcaster_signer_revoked": "האישור של Farcaster בוטל, נא לנסות שוב", + "farcaster_signer_failed": "החיבור ל-Farcaster נכשל", + "farcaster_approval_timeout": "פג תוקף האישור מ-Farcaster, נא לנסות שוב", "edit_autopost": "ערוך פרסום אוטומטי", "add_autopost_title": "הוסף פרסום אוטומטי", "webhook_deleted_successfully": "ה-Webhook נמחק בהצלחה", @@ -693,10 +700,31 @@ "connected_channels": "ערוצים מחוברים", "continue": "המשך", "continue_without_channels": "המשך ללא ערוצים", + "connect_agents": "חברו סוכנים", + "connect_your_ai_agent": "חברו את סוכן ה-AI שלכם", + "connect_agent_description": "בחרו את הסוכן שאתם משתמשים בו ותנו לו ליצור ולתזמן פוסטים עבורכם", + "agent_access_unavailable": "הגישה לסוכן אינה זמינה בתוכנית או בתפקיד הנוכחיים שלכם. ניתן להגדיר זאת מאוחר יותר בהגדרות > מפתחים.", + "sign_in_no_api_key": "התחברו ל-Postiz (ללא מפתח API)", + "oauth_sign_in_hint": "הסוכן שלכם יפתח חלון דפדפן כדי להיכנס ל-Postiz.", + "add_to_cursor": "הוסיפו ל-Cursor", + "cli": "CLI", + "other_agents": "סוכנים נוספים", + "documentation": "תיעוד", + "read_the_api_docs": "קראו את מסמכי ה-API", + "api_key_onboarding_description": "שלחו אותו בכותרת Authorization בכל בקשה", + "api_onboarding_description": "השתמשו ב-API של Postiz מהקוד שלכם, n8n או כל אוטומציה אחרת", + "chat": "צ'אט", + "chat_onboarding_description": "אין צורך ב-MCP או הגדרות CLI. העתיקו את זה לצ'אט, הסוכן יתקין את Postiz CLI וישאל אתכם את מפתח ה-API שלכם.", + "connector": "מחבר", + "connector_onboarding_description": "הדרך המהירה ביותר: הוסיפו את Postiz בלחיצה אחת, תתבקשו להתחבר", + "mcp_onboarding_description": "העניקו לסוכן שלכם כלים של Postiz ליצירת, תזמון וניהול פוסטים", + "cli_onboarding_description": "התקינו את Postiz CLI ואת המיומנות שמלמדת את הסוכן איך להשתמש בו", + "agent_settings_later": "סוכנים נוספים והוראות מלאות זמינים תחת הגדרות > מפתחים", "watch_tutorial": "צפה במדריך", "watch_tutorial_title": "למד כיצד להשתמש ב-Postiz", "watch_tutorial_description": "צפה בסרטון הקצר הזה ולמד כיצד להפיק את המרב מ-Postiz", "back": "חזרה", + "continue_skip": "המשך / דלג", "get_started": "התחלה", "kick_select_channel": "בחר ערוץ", "annual": "שנתי", diff --git a/libraries/react-shared-libraries/src/translation/locales/it/translation.json b/libraries/react-shared-libraries/src/translation/locales/it/translation.json index 2e4cd0717c..0aaa9c885b 100644 --- a/libraries/react-shared-libraries/src/translation/locales/it/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/it/translation.json @@ -575,7 +575,14 @@ "email_address": "Indirizzo email", "email_already_exists": "L'email esiste già", "google": "Google", + "apple": "Mela", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Scansiona il codice QR con il tuo telefono, oppure apri il link sul tuo telefono e poi approva Postiz nell'app Farcaster.", + "farcaster_open_in_farcaster": "Apri in Farcaster", + "farcaster_waiting_for_approval": "In attesa della tua approvazione...", + "farcaster_signer_revoked": "L'approvazione di Farcaster è stata revocata, riprova", + "farcaster_signer_failed": "Impossibile avviare la connessione con Farcaster", + "farcaster_approval_timeout": "L'approvazione di Farcaster è scaduta, riprova", "edit_autopost": "Modifica autopost", "add_autopost_title": "Aggiungi autopost", "webhook_deleted_successfully": "Webhook eliminato con successo", @@ -693,10 +700,31 @@ "connected_channels": "Canali collegati", "continue": "Continua", "continue_without_channels": "Continua senza canali", + "connect_agents": "Collega Agenti", + "connect_your_ai_agent": "Collega il tuo agente AI", + "connect_agent_description": "Scegli l'agente che usi e lascia che crei e programmi post per te", + "agent_access_unavailable": "L'accesso agli agenti non è disponibile per il tuo attuale piano o ruolo. Puoi configurarlo più tardi in Impostazioni > Sviluppatori.", + "sign_in_no_api_key": "Accedi con Postiz (nessuna API key)", + "oauth_sign_in_hint": "Il tuo agente aprirà una finestra del browser per accedere a Postiz.", + "add_to_cursor": "Aggiungi al Cursor", + "cli": "CLI", + "other_agents": "Altri agenti", + "documentation": "Documentazione", + "read_the_api_docs": "Leggi la documentazione API", + "api_key_onboarding_description": "Invialo come header Authorization in ogni richiesta", + "api_onboarding_description": "Usa le API di Postiz dal tuo codice, n8n o qualsiasi altra automazione", + "chat": "Chat", + "chat_onboarding_description": "Nessuna impostazione MCP o CLI necessaria. Incolla questo nella chat, l'agente installerà il Postiz CLI e ti chiederà la tua API key.", + "connector": "Connettore", + "connector_onboarding_description": "Il modo più veloce: aggiungi Postiz con un clic, ti verrà chiesto di accedere", + "mcp_onboarding_description": "Dai al tuo agente gli strumenti Postiz per creare, programmare e gestire post", + "cli_onboarding_description": "Installa il Postiz CLI e la skill che insegna al tuo agente come usarlo", + "agent_settings_later": "Altri agenti e istruzioni complete sono disponibili in Impostazioni > Sviluppatori", "watch_tutorial": "Guarda il tutorial", "watch_tutorial_title": "Scopri come usare Postiz", "watch_tutorial_description": "Guarda questo breve video per imparare a sfruttare al meglio Postiz", "back": "Indietro", + "continue_skip": "Continua / Salta", "get_started": "Inizia", "kick_select_channel": "Seleziona canale", "annual": "Annuale", diff --git a/libraries/react-shared-libraries/src/translation/locales/ja/translation.json b/libraries/react-shared-libraries/src/translation/locales/ja/translation.json index 155a3d1a64..4826e621a8 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ja/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ja/translation.json @@ -575,7 +575,14 @@ "email_address": "メールアドレス", "email_already_exists": "メールアドレスは既に存在します", "google": "Google", + "apple": "アップル", "farcaster": "Farcaster", + "farcaster_approve_instructions": "スマートフォンでQRコードをスキャンするか、リンクをスマートフォンで開き、FarcasterアプリでPostizを承認してください。", + "farcaster_open_in_farcaster": "Farcasterで開く", + "farcaster_waiting_for_approval": "承認をお待ちしています...", + "farcaster_signer_revoked": "Farcasterの承認が取り消されました。もう一度お試しください。", + "farcaster_signer_failed": "Farcaster接続の開始に失敗しました", + "farcaster_approval_timeout": "Farcasterの承認がタイムアウトしました。もう一度お試しください。", "edit_autopost": "自動投稿を編集", "add_autopost_title": "自動投稿を追加", "webhook_deleted_successfully": "Webhookが正常に削除されました", @@ -693,10 +700,31 @@ "connected_channels": "接続済みチャンネル", "continue": "続行", "continue_without_channels": "チャンネルなしで続行", + "connect_agents": "エージェントを接続", + "connect_your_ai_agent": "AIエージェントを接続", + "connect_agent_description": "利用するエージェントを選んで、投稿の作成・スケジュール管理を任せましょう", + "agent_access_unavailable": "現在のプランまたはロールではエージェントアクセスをご利用いただけません。設定 > 開発者 で後から設定することもできます。", + "sign_in_no_api_key": "Postizでサインイン(APIキー不要)", + "oauth_sign_in_hint": "エージェントがPostizにサインインするためのブラウザウィンドウを開きます。", + "add_to_cursor": "カーソルに追加", + "cli": "CLI", + "other_agents": "その他のエージェント", + "documentation": "ドキュメント", + "read_the_api_docs": "APIドキュメントを読む", + "api_key_onboarding_description": "すべてのリクエストで Authorization ヘッダーとして送信してください。", + "api_onboarding_description": "Postiz APIを自分のコードやn8n、その他の自動化から利用できます。", + "chat": "チャット", + "chat_onboarding_description": "MCPやCLIの設定は不要です。これをチャットに貼り付けるだけで、エージェントがPostiz CLIをインストールし、APIキーを尋ねます。", + "connector": "コネクタ", + "connector_onboarding_description": "最速の方法: ワンクリックでPostizを追加、サインインが求められます。", + "mcp_onboarding_description": "エージェントにPostizのツールを使わせて、投稿の作成やスケジュール管理をさせましょう。", + "cli_onboarding_description": "Postiz CLIと、それを使い方をエージェントに教えるスキルをインストールします。", + "agent_settings_later": "その他のエージェントや詳細な手順は、設定 > 開発者 から利用できます。", "watch_tutorial": "チュートリアルを見る", "watch_tutorial_title": "Postizの使い方を学ぶ", "watch_tutorial_description": "この短い動画を見て、Postizを最大限に活用する方法を学びましょう", "back": "戻る", + "continue_skip": "続行 / スキップ", "get_started": "開始", "kick_select_channel": "チャンネルを選択", "annual": "年額", diff --git a/libraries/react-shared-libraries/src/translation/locales/ko/translation.json b/libraries/react-shared-libraries/src/translation/locales/ko/translation.json index f2234dcefe..34193cd65a 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ko/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ko/translation.json @@ -575,7 +575,14 @@ "email_address": "이메일 주소", "email_already_exists": "이미 존재하는 이메일입니다", "google": "구글", + "apple": "애플", "farcaster": "파캐스터", + "farcaster_approve_instructions": "휴대폰으로 QR 코드를 스캔하거나, 링크를 휴대폰에서 열어 Farcaster 앱에서 Postiz 승인을 진행하세요.", + "farcaster_open_in_farcaster": "Farcaster에서 열기", + "farcaster_waiting_for_approval": "승인을 기다리는 중...", + "farcaster_signer_revoked": "Farcaster 승인이 취소되었습니다. 다시 시도해 주세요.", + "farcaster_signer_failed": "Farcaster 연결을 시작하지 못했습니다.", + "farcaster_approval_timeout": "Farcaster 승인 시간이 초과되었습니다. 다시 시도해 주세요.", "edit_autopost": "자동 게시 수정", "add_autopost_title": "자동 게시 추가", "webhook_deleted_successfully": "웹훅이 성공적으로 삭제되었습니다", @@ -693,10 +700,31 @@ "connected_channels": "연결된 채널", "continue": "계속하기", "continue_without_channels": "채널 없이 계속하기", + "connect_agents": "에이전트 연결", + "connect_your_ai_agent": "AI 에이전트 연결", + "connect_agent_description": "사용할 에이전트를 선택하면, 게시물을 생성하고 예약할 수 있습니다.", + "agent_access_unavailable": "현재 요금제 또는 역할에서는 에이전트 접근이 불가능합니다. 설정 > 개발자에서 나중에 설정할 수 있습니다.", + "sign_in_no_api_key": "Postiz로 로그인 (API 키 불필요)", + "oauth_sign_in_hint": "에이전트가 Postiz 로그인을 위해 브라우저 창을 엽니다.", + "add_to_cursor": "Cursor에 추가", + "cli": "CLI", + "other_agents": "기타 에이전트", + "documentation": "문서", + "read_the_api_docs": "API 문서 읽기", + "api_key_onboarding_description": "모든 요청에 Authorization 헤더로 전송하세요.", + "api_onboarding_description": "Postiz API를 직접 코드, n8n, 또는 다른 자동화 도구에서 사용하세요.", + "chat": "채팅", + "chat_onboarding_description": "MCP나 CLI 설정이 필요 없습니다. 채팅에 이 내용을 붙여넣으면 에이전트가 Postiz CLI를 설치하고 API 키를 입력받습니다.", + "connector": "커넥터", + "connector_onboarding_description": "가장 빠른 방법: 한 번의 클릭으로 Postiz를 추가하고, 로그인 요청을 받게 됩니다.", + "mcp_onboarding_description": "에이전트에게 Postiz 도구를 제공해 게시물을 생성, 예약, 관리할 수 있습니다.", + "cli_onboarding_description": "Postiz CLI와 에이전트에게 사용법을 알려주는 스킬을 설치하세요.", + "agent_settings_later": "더 많은 에이전트와 전체 안내는 설정 > 개발자에서 볼 수 있습니다.", "watch_tutorial": "튜토리얼 보기", "watch_tutorial_title": "Postiz 사용법 배우기", "watch_tutorial_description": "이 짧은 영상을 통해 Postiz를 최대한 활용하는 방법을 알아보세요", "back": "뒤로가기", + "continue_skip": "계속 / 건너뛰기", "get_started": "시작하기", "kick_select_channel": "채널 선택", "annual": "연간", diff --git a/libraries/react-shared-libraries/src/translation/locales/pt/translation.json b/libraries/react-shared-libraries/src/translation/locales/pt/translation.json index 0c6e50fbef..72e048f024 100644 --- a/libraries/react-shared-libraries/src/translation/locales/pt/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/pt/translation.json @@ -575,7 +575,14 @@ "email_address": "Endereço de e-mail", "email_already_exists": "O e-mail já existe", "google": "Google", + "apple": "Maçã", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Escaneie o código QR com seu celular, ou abra o link no seu celular, depois aprove o Postiz no app Farcaster.", + "farcaster_open_in_farcaster": "Abrir no Farcaster", + "farcaster_waiting_for_approval": "Aguardando sua aprovação...", + "farcaster_signer_revoked": "A aprovação do Farcaster foi revogada, por favor, tente novamente", + "farcaster_signer_failed": "Falha ao iniciar a conexão com o Farcaster", + "farcaster_approval_timeout": "A aprovação do Farcaster expirou, por favor, tente novamente", "edit_autopost": "Editar autopost", "add_autopost_title": "Adicionar autopost", "webhook_deleted_successfully": "Webhook excluído com sucesso", @@ -693,10 +700,31 @@ "connected_channels": "Canais conectados", "continue": "Continuar", "continue_without_channels": "Continuar sem canais", + "connect_agents": "Conectar Agentes", + "connect_your_ai_agent": "Conecte Seu Agente de IA", + "connect_agent_description": "Escolha o agente que você usa e deixe-o criar e agendar posts para você", + "agent_access_unavailable": "O acesso ao agente não está disponível para seu plano ou função atual. Você pode configurá-lo mais tarde em Configurações > Desenvolvedores.", + "sign_in_no_api_key": "Entrar com o Postiz (sem chave de API)", + "oauth_sign_in_hint": "Seu agente abrirá uma janela do navegador para fazer login no Postiz.", + "add_to_cursor": "Adicionar ao Cursor", + "cli": "CLI", + "other_agents": "Outros agentes", + "documentation": "Documentação", + "read_the_api_docs": "Leia a documentação da API", + "api_key_onboarding_description": "Envie como o cabeçalho Authorization em todas as requisições", + "api_onboarding_description": "Use a API do Postiz a partir do seu próprio código, n8n ou qualquer outra automação", + "chat": "Chat", + "chat_onboarding_description": "Não precisa de configurações MCP ou CLI. Cole isso no chat, o agente instala o Postiz CLI e pede sua chave de API.", + "connector": "Conector", + "connector_onboarding_description": "A forma mais rápida: adicione o Postiz com um clique, será solicitado que você faça login", + "mcp_onboarding_description": "Dê ao seu agente as ferramentas Postiz para criar, agendar e gerenciar posts", + "cli_onboarding_description": "Instale o Postiz CLI e a skill que ensina seu agente como usá-lo", + "agent_settings_later": "Mais agentes e instruções completas estão disponíveis em Configurações > Desenvolvedores", "watch_tutorial": "Assistir ao tutorial", "watch_tutorial_title": "Aprenda a usar o Postiz", "watch_tutorial_description": "Assista a este vídeo curto para aprender a tirar o máximo proveito do Postiz", "back": "Voltar", + "continue_skip": "Continuar / Pular", "get_started": "Começar", "kick_select_channel": "Selecionar canal", "annual": "Anual", diff --git a/libraries/react-shared-libraries/src/translation/locales/ru/translation.json b/libraries/react-shared-libraries/src/translation/locales/ru/translation.json index 7a89b62dc5..748d598333 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ru/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ru/translation.json @@ -575,7 +575,14 @@ "email_address": "Адрес электронной почты", "email_already_exists": "Электронная почта уже существует", "google": "Google", + "apple": "Яблоко", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Отсканируйте QR-код с помощью телефона или откройте ссылку на своём телефоне, затем одобрите Postiz в приложении Farcaster.", + "farcaster_open_in_farcaster": "Открыть в Farcaster", + "farcaster_waiting_for_approval": "Ожидание вашего одобрения...", + "farcaster_signer_revoked": "Одобрение Farcaster было отозвано, попробуйте ещё раз", + "farcaster_signer_failed": "Не удалось запустить соединение с Farcaster", + "farcaster_approval_timeout": "Время ожидания одобрения Farcaster истекло, попробуйте ещё раз", "edit_autopost": "Редактировать автопост", "add_autopost_title": "Добавить автопост", "webhook_deleted_successfully": "Вебхук успешно удалён", @@ -693,10 +700,31 @@ "connected_channels": "Подключенные каналы", "continue": "Продолжить", "continue_without_channels": "Продолжить без каналов", + "connect_agents": "Подключить агентов", + "connect_your_ai_agent": "Подключите вашего ИИ-агента", + "connect_agent_description": "Выберите используемого агента, чтобы он мог создавать и планировать публикации за вас", + "agent_access_unavailable": "Доступ к агенту недоступен для вашего текущего тарифа или роли. Позже вы сможете настроить это в Настройки > Разработчики.", + "sign_in_no_api_key": "Войти через Postiz (без API-ключа)", + "oauth_sign_in_hint": "Ваш агент откроет окно браузера для входа в Postiz.", + "add_to_cursor": "Добавить в Cursor", + "cli": "CLI", + "other_agents": "Другие агенты", + "documentation": "Документация", + "read_the_api_docs": "Прочитайте документацию по API", + "api_key_onboarding_description": "Передавайте его в заголовке Authorization при каждом запросе", + "api_onboarding_description": "Используйте API Postiz в своём коде, n8n или другой автоматизации", + "chat": "Чат", + "chat_onboarding_description": "Не нужны MCP или настройки CLI. Вставьте это в чат, агент установит Postiz CLI и спросит у вас API-ключ.", + "connector": "Коннектор", + "connector_onboarding_description": "Самый быстрый способ: добавьте Postiz одним кликом, вам предложат войти в систему", + "mcp_onboarding_description": "Дайте вашему агенту инструменты Postiz для создания, планирования и управления публикациями", + "cli_onboarding_description": "Установите Postiz CLI и навык, который научит вашего агента им пользоваться", + "agent_settings_later": "Больше агентов и полные инструкции доступны в разделе Настройки > Разработчики", "watch_tutorial": "Смотреть обучение", "watch_tutorial_title": "Узнайте, как пользоваться Postiz", "watch_tutorial_description": "Посмотрите это короткое видео, чтобы узнать, как получить максимум от Postiz", "back": "Назад", + "continue_skip": "Продолжить / Пропустить", "get_started": "Начать", "kick_select_channel": "Выберите канал", "annual": "Годовой", diff --git a/libraries/react-shared-libraries/src/translation/locales/tr/translation.json b/libraries/react-shared-libraries/src/translation/locales/tr/translation.json index 1435f18913..053450a004 100644 --- a/libraries/react-shared-libraries/src/translation/locales/tr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/tr/translation.json @@ -575,7 +575,14 @@ "email_address": "E-posta Adresi", "email_already_exists": "E-posta zaten mevcut", "google": "Google", + "apple": "Elma", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Telefonunuzla QR kodunu tarayın veya bağlantıyı telefonunuzda açın, ardından Postiz'i Farcaster uygulamasında onaylayın.", + "farcaster_open_in_farcaster": "Farcaster'da Aç", + "farcaster_waiting_for_approval": "Onayınızı bekliyoruz...", + "farcaster_signer_revoked": "Farcaster onayı iptal edildi, lütfen tekrar deneyin", + "farcaster_signer_failed": "Farcaster bağlantısı başlatılamadı", + "farcaster_approval_timeout": "Farcaster onayı zaman aşımına uğradı, lütfen tekrar deneyin", "edit_autopost": "Otomatik Gönderiyi Düzenle", "add_autopost_title": "Otomatik Gönderi Ekle", "webhook_deleted_successfully": "Webhook başarıyla silindi", @@ -693,10 +700,31 @@ "connected_channels": "Bağlı Kanallar", "continue": "Devam Et", "continue_without_channels": "Kanallar olmadan devam et", + "connect_agents": "Ajanları Bağla", + "connect_your_ai_agent": "Yapay Zeka Ajanınızı Bağlayın", + "connect_agent_description": "Kullandığınız ajanı seçin ve gönderi oluşturup zamanlamasına izin verin", + "agent_access_unavailable": "Ajan erişimi mevcut planınızda veya rolünüzde mevcut değil. Daha sonra Ayarlar > Geliştiriciler bölümünden kurabilirsiniz.", + "sign_in_no_api_key": "Postiz ile oturum aç (API anahtarı yok)", + "oauth_sign_in_hint": "Ajanınız, Postiz'e giriş yapmanız için bir tarayıcı penceresi açacak.", + "add_to_cursor": "Imlece Ekle", + "cli": "CLI", + "other_agents": "Diğer ajanlar", + "documentation": "Dokümantasyon", + "read_the_api_docs": "API dokümantasyonunu okuyun", + "api_key_onboarding_description": "Her istekte Authorization başlığı olarak gönderin", + "api_onboarding_description": "Postiz API'sini kendi kodunuzdan, n8n veya başka bir otomasyondan kullanın", + "chat": "Sohbet", + "chat_onboarding_description": "MCP veya CLI ayarlarına gerek yok. Bunu sohbete yapıştırın, ajan Postiz CLI'yı yükler ve sizden API anahtarınızı ister.", + "connector": "Konnektör", + "connector_onboarding_description": "En hızlı yol: Postiz'i tek tıkla ekleyin, giriş yapmanız istenecektir", + "mcp_onboarding_description": "Ajanınıza gönderi oluşturma, zamanlama ve yönetme araçları verin", + "cli_onboarding_description": "Postiz CLI ve ajanınıza bunun nasıl kullanılacağını öğreten beceriyi kurun", + "agent_settings_later": "Daha fazla ajan ve tam talimatlar Ayarlar > Geliştiriciler bölümünde mevcuttur", "watch_tutorial": "Eğitimi İzle", "watch_tutorial_title": "Postiz'i Nasıl Kullanacağınızı Öğrenin", "watch_tutorial_description": "Postiz'den en iyi şekilde yararlanmayı öğrenmek için bu kısa videoyu izleyin", "back": "Geri", + "continue_skip": "Devam Et / Atla", "get_started": "Başlayın", "kick_select_channel": "Kanal Seç", "annual": "Yıllık", diff --git a/libraries/react-shared-libraries/src/translation/locales/vi/translation.json b/libraries/react-shared-libraries/src/translation/locales/vi/translation.json index 42a159b6b7..1c8443af12 100644 --- a/libraries/react-shared-libraries/src/translation/locales/vi/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/vi/translation.json @@ -575,7 +575,14 @@ "email_address": "Địa chỉ email", "email_already_exists": "Email đã tồn tại", "google": "Google", + "apple": "Apple", "farcaster": "Farcaster", + "farcaster_approve_instructions": "Quét mã QR bằng điện thoại của bạn hoặc mở liên kết trên điện thoại, sau đó phê duyệt Postiz trong ứng dụng Farcaster.", + "farcaster_open_in_farcaster": "Mở trong Farcaster", + "farcaster_waiting_for_approval": "Đang chờ bạn phê duyệt...", + "farcaster_signer_revoked": "Phê duyệt Farcaster đã bị thu hồi, vui lòng thử lại", + "farcaster_signer_failed": "Không thể bắt đầu kết nối với Farcaster", + "farcaster_approval_timeout": "Phê duyệt Farcaster đã hết thời gian, vui lòng thử lại", "edit_autopost": "Chỉnh sửa tự động đăng", "add_autopost_title": "Thêm tự động đăng", "webhook_deleted_successfully": "Đã xóa webhook thành công", @@ -693,10 +700,31 @@ "connected_channels": "Các kênh đã kết nối", "continue": "Tiếp tục", "continue_without_channels": "Tiếp tục mà không có kênh", + "connect_agents": "Kết nối Agent", + "connect_your_ai_agent": "Kết nối Agent AI của bạn", + "connect_agent_description": "Chọn Agent bạn sử dụng và để nó tạo, lên lịch bài đăng cho bạn", + "agent_access_unavailable": "Truy cập Agent không khả dụng với gói hoặc vai trò hiện tại của bạn. Bạn có thể thiết lập sau tại Cài đặt > Nhà phát triển.", + "sign_in_no_api_key": "Đăng nhập với Postiz (không cần API key)", + "oauth_sign_in_hint": "Agent của bạn sẽ mở một cửa sổ trình duyệt để đăng nhập vào Postiz.", + "add_to_cursor": "Thêm vào Cursor", + "cli": "CLI", + "other_agents": "Các Agent khác", + "documentation": "Tài liệu", + "read_the_api_docs": "Đọc tài liệu API", + "api_key_onboarding_description": "Gửi nó như header Authorization cho mọi yêu cầu", + "api_onboarding_description": "Sử dụng API Postiz từ mã của bạn, n8n hoặc bất kỳ giải pháp tự động hóa nào khác", + "chat": "Chat", + "chat_onboarding_description": "Không cần cài đặt MCP hoặc CLI. Dán dòng này vào chat, Agent sẽ cài đặt Postiz CLI và yêu cầu API key của bạn.", + "connector": "Connector", + "connector_onboarding_description": "Nhanh nhất: thêm Postiz chỉ với một cú nhấp, bạn sẽ được yêu cầu đăng nhập", + "mcp_onboarding_description": "Cung cấp cho Agent của bạn các công cụ của Postiz để tạo, lên lịch và quản lý bài đăng", + "cli_onboarding_description": "Cài đặt Postiz CLI và kỹ năng hướng dẫn Agent của bạn cách sử dụng nó", + "agent_settings_later": "Thêm nhiều Agent và hướng dẫn đầy đủ có tại Cài đặt > Nhà phát triển", "watch_tutorial": "Xem hướng dẫn", "watch_tutorial_title": "Tìm hiểu cách sử dụng Postiz", "watch_tutorial_description": "Xem video ngắn này để biết cách tận dụng tối đa Postiz", "back": "Quay lại", + "continue_skip": "Tiếp tục / Bỏ qua", "get_started": "Bắt đầu", "kick_select_channel": "Chọn kênh", "annual": "Hàng năm", diff --git a/libraries/react-shared-libraries/src/translation/locales/zh/translation.json b/libraries/react-shared-libraries/src/translation/locales/zh/translation.json index 330f1c3353..e7e9a89bcb 100644 --- a/libraries/react-shared-libraries/src/translation/locales/zh/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/zh/translation.json @@ -575,7 +575,14 @@ "email_address": "电子邮件地址", "email_already_exists": "电子邮件已存在", "google": "Google", + "apple": "苹果", "farcaster": "Farcaster", + "farcaster_approve_instructions": "请用手机扫描二维码,或在手机上打开链接,然后在 Farcaster 应用内批准 Postiz。", + "farcaster_open_in_farcaster": "在 Farcaster 中打开", + "farcaster_waiting_for_approval": "正在等待您的批准...", + "farcaster_signer_revoked": "Farcaster 的批准已被撤销,请重试", + "farcaster_signer_failed": "无法启动 Farcaster 连接", + "farcaster_approval_timeout": "Farcaster 批准超时,请重试", "edit_autopost": "编辑自动发布", "add_autopost_title": "添加自动发布", "webhook_deleted_successfully": "Webhook 删除成功", @@ -693,10 +700,31 @@ "connected_channels": "已连接频道", "continue": "继续", "continue_without_channels": "继续但不添加频道", + "connect_agents": "连接代理", + "connect_your_ai_agent": "连接您的 AI 代理", + "connect_agent_description": "选择您使用的代理,让它为您创建和安排帖子", + "agent_access_unavailable": "您的当前套餐或角色无法使用代理访问。您可以稍后在 设置 > 开发者 中进行设置。", + "sign_in_no_api_key": "使用 Postiz 登录(无需 API 密钥)", + "oauth_sign_in_hint": "您的代理将会打开一个浏览器窗口用于登录 Postiz。", + "add_to_cursor": "添加到光标", + "cli": "CLI 命令行工具", + "other_agents": "其他代理", + "documentation": "文档", + "read_the_api_docs": "阅读 API 文档", + "api_key_onboarding_description": "在每次请求中,将其作为 Authorization header 发送", + "api_onboarding_description": "从您自己的代码、n8n 或任何其他自动化工具中使用 Postiz API", + "chat": "聊天", + "chat_onboarding_description": "无需 MCP 或 CLI 设置。将此粘贴到聊天中,代理会安装 Postiz CLI 并向您索取 API 密钥。", + "connector": "连接器", + "connector_onboarding_description": "最快捷的方法:一键添加 Postiz,系统会要求您登录", + "mcp_onboarding_description": "为您的代理提供 Postiz 工具,以创建、安排和管理帖子", + "cli_onboarding_description": "安装 Postiz CLI 以及教您的代理如何使用的技能", + "agent_settings_later": "更多代理和完整说明可在 设置 > 开发者 下查看", "watch_tutorial": "观看教程", "watch_tutorial_title": "学习如何使用Postiz", "watch_tutorial_description": "观看这个简短的视频,学习如何最大程度地利用Postiz", "back": "返回", + "continue_skip": "继续 / 跳过", "get_started": "开始使用", "kick_select_channel": "选择频道", "annual": "年度", diff --git a/package.json b/package.json index e0925759aa..27223fbcd6 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,6 @@ "@nestjs/swagger": "^11.4.3", "@nestjs/throttler": "^6.5.0", "@neynar/nodejs-sdk": "^3.112.0", - "@neynar/react": "^1.2.22", "@pigment-css/react": "^0.0.30", "@postiz/wallets": "^0.0.1", "@prisma/client": "6.5.0", @@ -200,6 +199,7 @@ "parse5": "^6.0.1", "polotno": "^3.0.0-beta.25", "posthog-js": "^1.178.0", + "qrcode": "^1.5.4", "react": "19.2.4", "react-colorful": "^5.6.1", "react-country-flag": "^3.1.0", @@ -272,6 +272,7 @@ "@types/jest": "29.5.12", "@types/node": "18.16.9", "@types/node-telegram-bot-api": "^0.64.7", + "@types/qrcode": "^1.5.5", "@types/react": "19.1.8", "@types/react-dom": "19.1.6", "@types/uuid": "^9.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2894952e8..53d420b93c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -128,9 +128,6 @@ importers: '@neynar/nodejs-sdk': specifier: ^3.112.0 version: 3.137.0(@nestjs/microservices@11.1.21)(@nestjs/platform-express@11.1.21)(bufferutil@4.1.0)(class-transformer@0.5.1)(class-validator@0.14.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@neynar/react': - specifier: ^1.2.22 - version: 1.2.22(@farcaster/miniapp-sdk@0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(swr@2.4.1(react@19.2.4))(typescript@5.5.4) '@pigment-css/react': specifier: ^0.0.30 version: 0.0.30(@types/react@19.1.8)(react@19.2.4)(typescript@5.5.4) @@ -497,6 +494,9 @@ importers: posthog-js: specifier: ^1.178.0 version: 1.359.1 + qrcode: + specifier: 1.5.4 + version: 1.5.4 react: specifier: 19.2.4 version: 19.2.4 @@ -708,6 +708,9 @@ importers: '@types/node-telegram-bot-api': specifier: ^0.64.7 version: 0.64.14 + '@types/qrcode': + specifier: 1.5.5 + version: 1.5.5 '@types/react': specifier: 19.1.8 version: 19.1.8 @@ -2671,17 +2674,6 @@ packages: '@expo/sudo-prompt@9.3.2': resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} - '@farcaster/miniapp-core@0.5.1': - resolution: {integrity: sha512-5QFn9zTV8GHUqZF31X9iwq9tNlnoOgP/o0UXb+QmdNeJsWXrhUFBKYl+C7KQOhVw2xqWKhBSDgYIHOkSRua3vg==} - - '@farcaster/miniapp-sdk@0.2.3': - resolution: {integrity: sha512-FwxqGcYCXw3HyGfDuchFUmQN9Gd49jTJs585zzQv6l1Oba6A/vVVCYohEG6QxRT6b/UrdemImpNMGTnqAZ3hKw==} - - '@farcaster/quick-auth@0.0.6': - resolution: {integrity: sha512-tiZndhpfDtEhaKlkmS5cVDuS+A/tafqZT3y9I44rC69m3beJok6e8dIH2JhxVy3EvOWTyTBnrmNn6GOOh+qK6A==} - peerDependencies: - typescript: 5.8.3 - '@fastify/busboy@3.2.0': resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} @@ -3538,6 +3530,7 @@ packages: '@langchain/community@0.3.59': resolution: {integrity: sha512-lYoVFC9wArWMXaixDgIadTE22jk4ZYAvSHHmwaMRagkGr5f4kyqMeJ83UUeW76XPx2cBy2fRSO+acSgqSuWE6A==} engines: {node: '>=18'} + deprecated: This package has been deprecated. See https://github.com/langchain-ai/langchainjs-community/issues/61 for more info peerDependencies: '@arcjet/redact': ^v1.0.0-alpha.23 '@aws-crypto/sha256-js': ^5.0.0 @@ -3918,6 +3911,7 @@ packages: '@langchain/community@1.1.27': resolution: {integrity: sha512-s2U3w7QV7QpkFtY1eZMni4poz+nKLFclpDi3a7hUbZ67ttsGaU9WkZ2BiLuzLIs+IFaUvON/KcGkE8EqAl9aPA==} engines: {node: '>=20'} + deprecated: This package has been deprecated. See https://github.com/langchain-ai/langchainjs-community/issues/61 for more info peerDependencies: '@arcjet/redact': ^v1.2.0 '@aws-crypto/sha256-js': ^5.0.0 @@ -5065,14 +5059,6 @@ packages: resolution: {integrity: sha512-VAqVg3O5An3E2izz3CYxh7gIz1t9PN3DP9CtDpu4uv8hpO2pjIDMIS55Z5Ef7dV1VwINCcubsQUcmv4un6bpfQ==} engines: {node: '>=19.9.0'} - '@neynar/react@1.2.22': - resolution: {integrity: sha512-HZWN1CvHQ8Hjg42hKZSM6JlnHG49f6UfAyCjTd2qGieAKvmrVOkQXJb48s48T1TmAi2ujMLvVadgst03VTkH7g==} - peerDependencies: - '@farcaster/miniapp-sdk': '>=0.1.6 <1.0.0' - react: 19.2.4 - react-dom: 19.2.4 - swr: ^2.3.2 - '@ngraveio/bc-ur@1.1.13': resolution: {integrity: sha512-j73akJMV4+vLR2yQ4AphPIT5HZmxVjn/LxpL7YHoINnXoH6ccc90Zzck6/n6a3bCXOVZwBxq+YHwbAKRV+P8Zg==} @@ -8675,6 +8661,9 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + '@types/qs@6.15.0': resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} @@ -8963,6 +8952,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -9985,6 +9975,7 @@ packages: basic-ftp@5.2.0: resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.1, please upgrade bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -10478,9 +10469,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - comlink@4.4.2: - resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} - comma-separated-tokens@1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} @@ -12408,9 +12396,6 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - hls.js@1.6.15: - resolution: {integrity: sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==} - hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -14415,14 +14400,6 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - mipd@0.0.7: - resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - mixwith@0.1.1: resolution: {integrity: sha512-DQsf/liljH/9e+94jR+xfK8vlKceeKdOM9H9UEXLwGuvEEpO6debNtJ9yt1ZKzPKPrwqGxzMdu0BR1fnQb6i4A==} @@ -14939,14 +14916,6 @@ packages: typescript: optional: true - ox@0.4.4: - resolution: {integrity: sha512-oJPEeCDs9iNiPs6J0rTx+Y0KGeCGyCAA3zo94yZhm8G5WpOxrwUtn2Ie/Y8IyARSqqY/j9JTKA3Fc1xs1DvFnw==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - ox@0.6.7: resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} peerDependencies: @@ -17363,6 +17332,7 @@ packages: tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -21151,37 +21121,6 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@farcaster/miniapp-core@0.5.1(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)': - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - ox: 0.4.4(typescript@5.5.4)(zod@3.25.76) - zod: 3.25.76 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@farcaster/miniapp-sdk@0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': - dependencies: - '@farcaster/miniapp-core': 0.5.1(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@farcaster/quick-auth': 0.0.6(typescript@5.5.4) - comlink: 4.4.2 - eventemitter3: 5.0.4 - ox: 0.4.4(typescript@5.5.4)(zod@3.25.76) - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - zod - - '@farcaster/quick-auth@0.0.6(typescript@5.5.4)': - dependencies: - jose: 5.10.0 - typescript: 5.5.4 - zod: 3.25.76 - '@fastify/busboy@3.2.0': {} '@fastify/otel@0.17.1(@opentelemetry/api@1.9.0)': @@ -23285,17 +23224,6 @@ snapshots: - utf-8-validate - zod - '@neynar/react@1.2.22(@farcaster/miniapp-sdk@0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(swr@2.4.1(react@19.2.4))(typescript@5.5.4)': - dependencies: - '@farcaster/miniapp-sdk': 0.2.3(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - hls.js: 1.6.15 - mipd: 0.0.7(typescript@5.5.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - swr: 2.4.1(react@19.2.4) - transitivePeerDependencies: - - typescript - '@ngraveio/bc-ur@1.1.13': dependencies: '@keystonehq/alias-sampling': 0.1.2 @@ -27867,6 +27795,10 @@ snapshots: '@types/prop-types@15.7.15': {} + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 18.16.9 + '@types/qs@6.15.0': {} '@types/range-parser@1.2.7': {} @@ -30442,8 +30374,6 @@ snapshots: dependencies: delayed-stream: 1.0.0 - comlink@4.4.2: {} - comma-separated-tokens@1.0.8: {} comma-separated-tokens@2.0.3: {} @@ -32993,8 +32923,6 @@ snapshots: highlightjs-vue@1.0.0: {} - hls.js@1.6.15: {} - hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -35596,10 +35524,6 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mipd@0.0.7(typescript@5.5.4): - optionalDependencies: - typescript: 5.5.4 - mixwith@0.1.1: {} mkdirp@1.0.4: {} @@ -36135,20 +36059,6 @@ snapshots: transitivePeerDependencies: - zod - ox@0.4.4(typescript@5.5.4)(zod@3.25.76): - dependencies: - '@adraffy/ens-normalize': 1.11.1 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.2.3(typescript@5.5.4)(zod@3.25.76) - eventemitter3: 5.0.1 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - zod - ox@0.6.7(typescript@5.5.4)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 From d2246cbcecddb943854950af4e0a7bad233840ef Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 14 Sep 2026 20:52:51 +0700 Subject: [PATCH 16/61] fix(facebook): use META_GRAPH_API_VERSION for video_insights instead of hardcoded v23.0 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01B31McizpPZ7MhPdHSmbpt2 --- .../src/integrations/social/facebook.provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 3fb17d0386..6e55fc3dd6 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -1111,7 +1111,7 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { // response doesn't throw an ApplicationFailure — we want a quiet `[]` instead. const { data, error } = await ( await fetch( - `https://graph.facebook.com/v23.0/${videoId}/video_insights?metric=total_video_impressions,total_video_views,total_video_reactions_by_type_total&access_token=${accessToken}` + `https://graph.facebook.com/${META_GRAPH_API_VERSION}/${videoId}/video_insights?metric=total_video_impressions,total_video_views,total_video_reactions_by_type_total&access_token=${accessToken}` ) ).json(); From 03fab81ad997a81ae7ff208a6f7a3debe1d20ee4 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 14 Sep 2026 21:07:55 +0700 Subject: [PATCH 17/61] fix(farcaster): keep polling the signer status on network errors A thrown fetch inside the async generator ended the for-await loop and left the modal spinning with no timeout. Catch it and keep polling, as the Moltbook status poll does; the 10 minute cap still applies. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01R8gvBNgPqqayC9zGPB5R5a --- .../auth/providers/farcaster.provider.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx index 2fbc24a369..5d0d281cb6 100644 --- a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx +++ b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx @@ -27,12 +27,18 @@ export const ButtonCaster: FC<{ async function* load(signerUuid: string) { while (true) { - const data = await ( - await fetch( - `/auth/farcaster/signer?signerUuid=${encodeURIComponent(signerUuid)}` - ) - ).json(); - yield data; + try { + yield await ( + await fetch( + `/auth/farcaster/signer?signerUuid=${encodeURIComponent( + signerUuid + )}` + ) + ).json(); + } catch (err) { + // network blip, keep polling until approved or timed out + yield {}; + } } } From 889f87f41778e445cf0c785f5be8ce295b9148b9 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 14 Sep 2026 21:32:31 +0700 Subject: [PATCH 18/61] fix(farcaster): throttle the public signer creation route POST /auth/farcaster/signer is unauthenticated and creates a signer at Neynar on every call. The global throttler guard only covers the public posts API, so add a route-level guard keyed by the forwarded client address and cap the route at 10 requests per hour per address. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01R8gvBNgPqqayC9zGPB5R5a --- apps/backend/src/api/routes/auth.controller.ts | 6 ++++++ .../src/throttler/throttler.provider.ts | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index db6b647391..0a44332166 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -7,7 +7,10 @@ import { Query, Req, Res, + UseGuards, } from '@nestjs/common'; +import { Throttle } from '@nestjs/throttler'; +import { ThrottlerRealIpGuard } from '@gitroom/nestjs-libraries/throttler/throttler.provider'; import { Response, Request } from 'express'; import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto'; @@ -286,6 +289,9 @@ export class AuthController { } } + // public and creates a signer at Neynar per call, so cap it per client + @UseGuards(ThrottlerRealIpGuard) + @Throttle({ default: { limit: 10, ttl: 3600000 } }) @Post('/farcaster/signer') async farcasterSigner() { try { diff --git a/libraries/nestjs-libraries/src/throttler/throttler.provider.ts b/libraries/nestjs-libraries/src/throttler/throttler.provider.ts index 72b218d559..db506f9ffd 100644 --- a/libraries/nestjs-libraries/src/throttler/throttler.provider.ts +++ b/libraries/nestjs-libraries/src/throttler/throttler.provider.ts @@ -23,3 +23,15 @@ export class ThrottlerBehindProxyGuard extends ThrottlerGuard { ); } } + +// route-level guard for public endpoints, keyed by the client address the +// proxy forwards rather than the org the global guard expects +@Injectable() +export class ThrottlerRealIpGuard extends ThrottlerGuard { + protected override async getTracker( + req: Record + ): Promise { + const forwarded = String(req.headers?.['x-forwarded-for'] || ''); + return forwarded.split(',')[0].trim() || req.ip; + } +} From f23ebf72c310581c1bfeab992305d740cb92db9a Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 14 Sep 2026 21:55:03 +0700 Subject: [PATCH 19/61] fix(farcaster): throttle the public signer status route GET /auth/farcaster/signer is unauthenticated and calls Neynar on every request. Apply the same per-address guard as the create route, with a ceiling of 1000 per hour so the modal's 2s poll over a 10 minute window still fits several approvals. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01R8gvBNgPqqayC9zGPB5R5a --- apps/backend/src/api/routes/auth.controller.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index 0a44332166..5c421a210c 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -301,6 +301,9 @@ export class AuthController { } } + // the modal polls every 2s for up to 10 minutes, so leave room for that + @UseGuards(ThrottlerRealIpGuard) + @Throttle({ default: { limit: 1000, ttl: 3600000 } }) @Get('/farcaster/signer') async farcasterSignerStatus(@Query('signerUuid') signerUuid: string) { try { From d46c7bb7c1efbf5fbeea4912e67b42b077c5afc5 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 14 Sep 2026 22:34:00 +0700 Subject: [PATCH 20/61] chore: sync lockfile qrcode specifiers --- pnpm-lock.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53d420b93c..0a45e55f4a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -495,7 +495,7 @@ importers: specifier: ^1.178.0 version: 1.359.1 qrcode: - specifier: 1.5.4 + specifier: ^1.5.4 version: 1.5.4 react: specifier: 19.2.4 @@ -709,7 +709,7 @@ importers: specifier: ^0.64.7 version: 0.64.14 '@types/qrcode': - specifier: 1.5.5 + specifier: ^1.5.5 version: 1.5.5 '@types/react': specifier: 19.1.8 From 16517c21e98d0e8b716d111c0e153c15f8384fcd Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Mon, 14 Sep 2026 22:47:29 +0700 Subject: [PATCH 21/61] fix(farcaster): url-encode the base64 code in redirects --- .../src/components/auth/providers/farcaster.provider.tsx | 2 +- .../frontend/src/components/launches/add.provider.component.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx index 5d0d281cb6..9e5e16361b 100644 --- a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx +++ b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx @@ -10,7 +10,7 @@ export const FarcasterProvider = () => { const fetch = useFetch(); const gotoLogin = useCallback(async (code: string) => { const state = await (await fetch('/auth/oauth/FARCASTER')).text(); - window.location.href = `/auth?provider=FARCASTER&code=${code}&state=${state}`; + window.location.href = `/auth?provider=FARCASTER&code=${encodeURIComponent(code)}&state=${state}`; }, []); return ; }; diff --git a/apps/frontend/src/components/launches/add.provider.component.tsx b/apps/frontend/src/components/launches/add.provider.component.tsx index 9ff651acb7..17ba433073 100644 --- a/apps/frontend/src/components/launches/add.provider.component.tsx +++ b/apps/frontend/src/components/launches/add.provider.component.tsx @@ -453,7 +453,7 @@ export const AddProviderComponent: FC<{ > { - window.location.href = `/integrations/social/${identifier}?code=${code}&state=${newState}${ + window.location.href = `/integrations/social/${identifier}?code=${encodeURIComponent(code)}&state=${newState}${ onboarding ? '&onboarding=true' : '' }`; }} From 8ce68f1a47a94746092fc507bf3e5d96115e6fa3 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 15 Sep 2026 12:55:55 +0700 Subject: [PATCH 22/61] fix(farcaster): show the approval QR in a modal instead of a blank tab After the managed-signer migration, clicking Farcaster on the login and signup pages opened a new tab to the approval link, which only redirects to the farcaster:// scheme and stays blank on desktop, while the QR was squeezed into the narrow provider button slot. The approval view now opens straight in a modal on the login and signup pages and replaces the intermediate button step in the add/reconnect channel modal. No tab opens; a Copy Farcaster link button replaces the Open in Farcaster link. The auth layout mounts the shared modal manager and the toaster, so errors on those pages are visible. A response without an approval link (for example the rate limit) now shows the failure toaster instead of leaving the modal empty, and the signer creation limit is raised from 10 to 30 per hour per address. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01R8gvBNgPqqayC9zGPB5R5a --- .../backend/src/api/routes/auth.controller.ts | 2 +- apps/frontend/src/app/(app)/auth/layout.tsx | 37 ++-- .../auth/providers/farcaster.provider.tsx | 174 ++++++++++-------- .../web3/providers/wrapcaster.provider.tsx | 9 +- i18n.lock | 2 + .../translation/locales/ar/translation.json | 2 + .../translation/locales/bn/translation.json | 2 + .../translation/locales/de/translation.json | 2 + .../translation/locales/en/translation.json | 2 + .../translation/locales/es/translation.json | 2 + .../translation/locales/fr/translation.json | 2 + .../translation/locales/he/translation.json | 2 + .../translation/locales/it/translation.json | 2 + .../translation/locales/ja/translation.json | 2 + .../translation/locales/ko/translation.json | 2 + .../translation/locales/pt/translation.json | 2 + .../translation/locales/ru/translation.json | 2 + .../translation/locales/tr/translation.json | 2 + .../translation/locales/vi/translation.json | 2 + .../translation/locales/zh/translation.json | 2 + 20 files changed, 160 insertions(+), 94 deletions(-) diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index 5c421a210c..60b29cf0ea 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -291,7 +291,7 @@ export class AuthController { // public and creates a signer at Neynar per call, so cap it per client @UseGuards(ThrottlerRealIpGuard) - @Throttle({ default: { limit: 10, ttl: 3600000 } }) + @Throttle({ default: { limit: 30, ttl: 3600000 } }) @Post('/farcaster/signer') async farcasterSigner() { try { diff --git a/apps/frontend/src/app/(app)/auth/layout.tsx b/apps/frontend/src/app/(app)/auth/layout.tsx index b53f0f18b6..e7e8f42528 100644 --- a/apps/frontend/src/app/(app)/auth/layout.tsx +++ b/apps/frontend/src/app/(app)/auth/layout.tsx @@ -5,6 +5,8 @@ import { ReactNode } from 'react'; import loadDynamic from 'next/dynamic'; import { TestimonialComponent } from '@gitroom/frontend/components/auth/testimonial.component'; import { LogoTextComponent } from '@gitroom/frontend/components/ui/logo-text.component'; +import { MantineWrapper } from '@gitroom/react/helpers/mantine.wrapper'; +import { Toaster } from '@gitroom/react/toaster/toaster'; const ReturnUrlComponent = loadDynamic(() => import('./return.url.component')); export default async function AuthLayout({ children, @@ -14,24 +16,27 @@ export default async function AuthLayout({ const t = await getT(); return ( -
- {/**/} - -
-
- -
{children}
+ + +
+ {/**/} + +
+
+ +
{children}
+
-
-
-
- Over 20,000+{' '} - Entrepreneurs use -
- Postiz To Grow Their Social Presence +
+
+ Over 20,000+{' '} + Entrepreneurs use +
+ Postiz To Grow Their Social Presence +
+
-
-
+
); } diff --git a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx index 9e5e16361b..9c1cb3b0c9 100644 --- a/apps/frontend/src/components/auth/providers/farcaster.provider.tsx +++ b/apps/frontend/src/components/auth/providers/farcaster.provider.tsx @@ -5,23 +5,71 @@ import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { timer } from '@gitroom/helpers/utils/timer'; import { useToaster } from '@gitroom/react/toaster/toaster'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; +import { useModals } from '@gitroom/frontend/components/layout/new-modal'; +import { Button } from '@gitroom/react/form/button'; +import copy from 'copy-to-clipboard'; import Loading from '@gitroom/frontend/components/layout/loading'; export const FarcasterProvider = () => { const fetch = useFetch(); + const modal = useModals(); + const t = useT(); const gotoLogin = useCallback(async (code: string) => { const state = await (await fetch('/auth/oauth/FARCASTER')).text(); window.location.href = `/auth?provider=FARCASTER&code=${encodeURIComponent(code)}&state=${state}`; }, []); - return ; + const open = useCallback(() => { + modal.openModal({ + title: t('farcaster', 'Farcaster'), + withCloseButton: true, + classNames: { + modal: 'bg-transparent text-textColor', + }, + children: (close) => ( + + ), + }); + }, []); + return ( +
+ + + + + + + + + + + +
{t('farcaster', 'Farcaster')}
+
+ ); }; -export const ButtonCaster: FC<{ +export const FarcasterApproval: FC<{ login: (code: string) => void; + onFail: () => void; }> = (props) => { - const { login } = props; + const { login, onFail } = props; const fetch = useFetch(); const toaster = useToaster(); const t = useT(); - const stop = useRef(false); + const activeSigner = useRef(''); const [approvalUrl, setApprovalUrl] = useState(''); const [qrCode, setQrCode] = useState(''); @@ -43,11 +91,11 @@ export const ButtonCaster: FC<{ } const poll = async (signerUuid: string) => { - stop.current = false; + activeSigner.current = signerUuid; const startedAt = Date.now(); const generator = load(signerUuid); for await (const data of generator) { - if (stop.current) { + if (activeSigner.current !== signerUuid) { return; } if (data.status === 'approved') { @@ -62,7 +110,7 @@ export const ButtonCaster: FC<{ ), 'warning' ); - setApprovalUrl(''); + onFail(); return; } if (Date.now() - startedAt > 10 * 60 * 1000) { @@ -73,105 +121,85 @@ export const ButtonCaster: FC<{ ), 'warning' ); - setApprovalUrl(''); + onFail(); return; } await timer(2000); } }; - const start = useCallback(async () => { - // opened synchronously on click so popup blockers allow it - const approvalWindow = window.open('', '_blank'); + const start = async () => { try { const data = await ( await fetch('/auth/farcaster/signer', { method: 'POST' }) ).json(); - if (data.error) { - approvalWindow?.close(); - toaster.show(data.error, 'warning'); + if (!data.approvalUrl) { + toaster.show( + data.error || + t( + 'farcaster_signer_failed', + 'Failed to start the Farcaster connection' + ), + 'warning' + ); + onFail(); return; } setApprovalUrl(data.approvalUrl); setQrCode(data.qrCode); - if (approvalWindow) { - approvalWindow.location.href = data.approvalUrl; - } poll(data.signerUuid); } catch (err) { - approvalWindow?.close(); toaster.show( t('farcaster_signer_failed', 'Failed to start the Farcaster connection'), 'warning' ); + onFail(); } - }, []); + }; + + const copyLink = useCallback(() => { + copy(approvalUrl); + toaster.show( + t('link_copied_to_clipboard', 'Link copied to clipboard'), + 'success' + ); + }, [approvalUrl]); useEffect(() => { + start(); return () => { - stop.current = true; + activeSigner.current = ''; }; }, []); - if (approvalUrl) { + if (!approvalUrl) { return ( -
- -
- {t( - 'farcaster_approve_instructions', - 'Scan the QR code with your phone, or open the link on your phone, then approve Postiz in the Farcaster app.' - )} -
- - {t('farcaster_open_in_farcaster', 'Open in Farcaster')} - -
- - {t('farcaster_waiting_for_approval', 'Waiting for your approval...')} -
+
+
); } return ( -
- - - - - - - - - - - -
{t('farcaster', 'Farcaster')}
+
+ +
+ {t( + 'farcaster_scan_instructions', + 'Scan the QR code with your phone, or copy the link and open it on your phone, then approve Postiz in the Farcaster app.' + )} +
+ +
+ + {t('farcaster_waiting_for_approval', 'Waiting for your approval...')} +
); }; diff --git a/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx b/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx index 26b79fc32b..fec71e5f8a 100644 --- a/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx +++ b/apps/frontend/src/components/launches/web3/providers/wrapcaster.provider.tsx @@ -3,9 +3,11 @@ import React, { FC, useState, useCallback } from 'react'; import { Web3ProviderInterface } from '@gitroom/frontend/components/launches/web3/web3.provider.interface'; import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; -import { ButtonCaster } from '@gitroom/frontend/components/auth/providers/farcaster.provider'; +import { useModals } from '@gitroom/frontend/components/layout/new-modal'; +import { FarcasterApproval } from '@gitroom/frontend/components/auth/providers/farcaster.provider'; export const WrapcasterProvider: FC = (props) => { const [_, state] = props.nonce.split('||'); + const modal = useModals(); const [hide, setHide] = useState(false); const auth = useCallback( (code: string) => { @@ -21,9 +23,8 @@ export const WrapcasterProvider: FC = (props) => {
) : ( -
-
Click on the bottom below to start the process
- +
+
)}
diff --git a/i18n.lock b/i18n.lock index f2d736216a..88840d1e14 100644 --- a/i18n.lock +++ b/i18n.lock @@ -586,6 +586,8 @@ checksums: farcaster_waiting_for_approval: 2ee1cd6c0ff8d0db1a4924c08b80e498 farcaster_signer_revoked: 0eff3e12951a952f8db78f54be25cf2d farcaster_signer_failed: d3274186449d73fb6ffb37b2f47bb9d4 + farcaster_scan_instructions: 28fdf8386de75fc770b3c2585a3cf8bc + farcaster_copy_link: 3bf926fddc31ea08755160e6abce8674 farcaster_approval_timeout: 2a434e0962661820d56dba28a88ec18d edit_autopost: 2cde36144cddda0acc069e6913e095f9 add_autopost_title: d018d5d12c9f41c0b610da4b101d77e9 diff --git a/libraries/react-shared-libraries/src/translation/locales/ar/translation.json b/libraries/react-shared-libraries/src/translation/locales/ar/translation.json index 912a66eacb..edebb4fa8c 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ar/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ar/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "بانتظار موافقتك...", "farcaster_signer_revoked": "تم إلغاء موافقة Farcaster، يرجى المحاولة مرة أخرى", "farcaster_signer_failed": "فشل بدء الاتصال بـ Farcaster", + "farcaster_scan_instructions": "امسح رمز الاستجابة السريعة (QR) بهاتفك، أو انسخ الرابط وافتحه على هاتفك، ثم وافق على Postiz في تطبيق Farcaster.", + "farcaster_copy_link": "انسخ رابط Farcaster", "farcaster_approval_timeout": "انتهت مهلة موافقة Farcaster، يرجى المحاولة مرة أخرى", "edit_autopost": "تعديل النشر التلقائي", "add_autopost_title": "إضافة نشر تلقائي", diff --git a/libraries/react-shared-libraries/src/translation/locales/bn/translation.json b/libraries/react-shared-libraries/src/translation/locales/bn/translation.json index 7ec2e9cb56..c4b21d5cd0 100644 --- a/libraries/react-shared-libraries/src/translation/locales/bn/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/bn/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "আপনার অনুমোদনের জন্য অপেক্ষা করা হচ্ছে...", "farcaster_signer_revoked": "Farcaster অনুমোদন বাতিল করা হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন", "farcaster_signer_failed": "Farcaster সংযোগ শুরু করতে ব্যর্থ হয়েছে", + "farcaster_scan_instructions": "আপনার ফোন দিয়ে QR কোডটি স্ক্যান করুন, অথবা লিঙ্কটি কপি করে আপনার ফোনে খুলুন, এরপর Farcaster অ্যাপে Postiz অনুমোদন দিন।", + "farcaster_copy_link": "Farcaster লিঙ্ক কপি করুন", "farcaster_approval_timeout": "Farcaster অনুমোদন সময় শেষ হয়েছে, অনুগ্রহ করে আবার চেষ্টা করুন", "edit_autopost": "অটোপোস্ট সম্পাদনা করুন", "add_autopost_title": "অটোপোস্ট যোগ করুন", diff --git a/libraries/react-shared-libraries/src/translation/locales/de/translation.json b/libraries/react-shared-libraries/src/translation/locales/de/translation.json index 032720140f..1d2f5347fb 100644 --- a/libraries/react-shared-libraries/src/translation/locales/de/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/de/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "Warte auf deine Bestätigung...", "farcaster_signer_revoked": "Die Farcaster-Bestätigung wurde widerrufen, bitte versuche es erneut.", "farcaster_signer_failed": "Die Verbindung zu Farcaster konnte nicht gestartet werden.", + "farcaster_scan_instructions": "Scannen Sie den QR-Code mit Ihrem Handy oder kopieren Sie den Link und öffnen Sie ihn auf Ihrem Handy. Genehmigen Sie dann Postiz in der Farcaster-App.", + "farcaster_copy_link": "Farcaster-Link kopieren", "farcaster_approval_timeout": "Zeitüberschreitung bei der Farcaster-Bestätigung, bitte versuche es erneut.", "edit_autopost": "Autopost bearbeiten", "add_autopost_title": "Autopost hinzufügen", diff --git a/libraries/react-shared-libraries/src/translation/locales/en/translation.json b/libraries/react-shared-libraries/src/translation/locales/en/translation.json index 7ba1cabf9c..eafd8f855f 100644 --- a/libraries/react-shared-libraries/src/translation/locales/en/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/en/translation.json @@ -583,6 +583,8 @@ "farcaster_waiting_for_approval": "Waiting for your approval...", "farcaster_signer_revoked": "The Farcaster approval was revoked, please try again", "farcaster_signer_failed": "Failed to start the Farcaster connection", + "farcaster_scan_instructions": "Scan the QR code with your phone, or copy the link and open it on your phone, then approve Postiz in the Farcaster app.", + "farcaster_copy_link": "Copy Farcaster link", "farcaster_approval_timeout": "Farcaster approval timed out, please try again", "edit_autopost": "Edit Autopost", "add_autopost_title": "Add Autopost", diff --git a/libraries/react-shared-libraries/src/translation/locales/es/translation.json b/libraries/react-shared-libraries/src/translation/locales/es/translation.json index e17bd83f36..341056dc46 100644 --- a/libraries/react-shared-libraries/src/translation/locales/es/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/es/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "Esperando su aprobación...", "farcaster_signer_revoked": "La aprobación de Farcaster fue revocada, intente nuevamente", "farcaster_signer_failed": "No se pudo iniciar la conexión con Farcaster", + "farcaster_scan_instructions": "Escanea el código QR con tu teléfono, o copia el enlace y ábrelo en tu teléfono, luego aprueba Postiz en la app de Farcaster.", + "farcaster_copy_link": "Copiar enlace de Farcaster", "farcaster_approval_timeout": "El tiempo de aprobación de Farcaster se agotó, intente nuevamente", "edit_autopost": "Editar autopublicación", "add_autopost_title": "Agregar autopublicación", diff --git a/libraries/react-shared-libraries/src/translation/locales/fr/translation.json b/libraries/react-shared-libraries/src/translation/locales/fr/translation.json index e507cdb4cb..5289e94fa5 100644 --- a/libraries/react-shared-libraries/src/translation/locales/fr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/fr/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "En attente de votre approbation...", "farcaster_signer_revoked": "L’approbation Farcaster a été révoquée, veuillez réessayer", "farcaster_signer_failed": "Échec de la connexion à Farcaster", + "farcaster_scan_instructions": "Scannez le code QR avec votre téléphone, ou copiez le lien et ouvrez-le sur votre téléphone, puis approuvez Postiz dans l’application Farcaster.", + "farcaster_copy_link": "Copier le lien Farcaster", "farcaster_approval_timeout": "Le délai d’approbation Farcaster est dépassé, veuillez réessayer", "edit_autopost": "Modifier l'autopost", "add_autopost_title": "Ajouter un autopost", diff --git a/libraries/react-shared-libraries/src/translation/locales/he/translation.json b/libraries/react-shared-libraries/src/translation/locales/he/translation.json index c042ebb7d8..c80453e5e5 100644 --- a/libraries/react-shared-libraries/src/translation/locales/he/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/he/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "מחכים לאישור ממך...", "farcaster_signer_revoked": "האישור של Farcaster בוטל, נא לנסות שוב", "farcaster_signer_failed": "החיבור ל-Farcaster נכשל", + "farcaster_scan_instructions": "סרוק את קוד ה-QR עם הטלפון שלך, או העתק את הקישור ופתח אותו בטלפון, ואז אשר את Postiz באפליקציית Farcaster.", + "farcaster_copy_link": "העתק קישור Farcaster", "farcaster_approval_timeout": "פג תוקף האישור מ-Farcaster, נא לנסות שוב", "edit_autopost": "ערוך פרסום אוטומטי", "add_autopost_title": "הוסף פרסום אוטומטי", diff --git a/libraries/react-shared-libraries/src/translation/locales/it/translation.json b/libraries/react-shared-libraries/src/translation/locales/it/translation.json index 0aaa9c885b..8c12fd08df 100644 --- a/libraries/react-shared-libraries/src/translation/locales/it/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/it/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "In attesa della tua approvazione...", "farcaster_signer_revoked": "L'approvazione di Farcaster è stata revocata, riprova", "farcaster_signer_failed": "Impossibile avviare la connessione con Farcaster", + "farcaster_scan_instructions": "Scansiona il codice QR con il tuo telefono, oppure copia il link e aprilo sul tuo telefono, quindi approva Postiz nell'app Farcaster.", + "farcaster_copy_link": "Copia il link di Farcaster", "farcaster_approval_timeout": "L'approvazione di Farcaster è scaduta, riprova", "edit_autopost": "Modifica autopost", "add_autopost_title": "Aggiungi autopost", diff --git a/libraries/react-shared-libraries/src/translation/locales/ja/translation.json b/libraries/react-shared-libraries/src/translation/locales/ja/translation.json index 4826e621a8..0ce5b6b737 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ja/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ja/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "承認をお待ちしています...", "farcaster_signer_revoked": "Farcasterの承認が取り消されました。もう一度お試しください。", "farcaster_signer_failed": "Farcaster接続の開始に失敗しました", + "farcaster_scan_instructions": "QRコードをスマートフォンでスキャンするか、リンクをコピーしてスマートフォンで開き、FarcasterアプリでPostizを承認してください。", + "farcaster_copy_link": "Farcasterのリンクをコピー", "farcaster_approval_timeout": "Farcasterの承認がタイムアウトしました。もう一度お試しください。", "edit_autopost": "自動投稿を編集", "add_autopost_title": "自動投稿を追加", diff --git a/libraries/react-shared-libraries/src/translation/locales/ko/translation.json b/libraries/react-shared-libraries/src/translation/locales/ko/translation.json index 34193cd65a..9dc6d1049d 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ko/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ko/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "승인을 기다리는 중...", "farcaster_signer_revoked": "Farcaster 승인이 취소되었습니다. 다시 시도해 주세요.", "farcaster_signer_failed": "Farcaster 연결을 시작하지 못했습니다.", + "farcaster_scan_instructions": "휴대폰으로 QR 코드를 스캔하거나 링크를 복사해서 휴대폰에서 연 다음, Farcaster 앱에서 Postiz를 승인하세요.", + "farcaster_copy_link": "Farcaster 링크 복사", "farcaster_approval_timeout": "Farcaster 승인 시간이 초과되었습니다. 다시 시도해 주세요.", "edit_autopost": "자동 게시 수정", "add_autopost_title": "자동 게시 추가", diff --git a/libraries/react-shared-libraries/src/translation/locales/pt/translation.json b/libraries/react-shared-libraries/src/translation/locales/pt/translation.json index 72e048f024..08b003921b 100644 --- a/libraries/react-shared-libraries/src/translation/locales/pt/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/pt/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "Aguardando sua aprovação...", "farcaster_signer_revoked": "A aprovação do Farcaster foi revogada, por favor, tente novamente", "farcaster_signer_failed": "Falha ao iniciar a conexão com o Farcaster", + "farcaster_scan_instructions": "Escaneie o código QR com seu celular ou copie o link e abra-o no seu celular, depois aprove o Postiz no aplicativo Farcaster.", + "farcaster_copy_link": "Copiar link do Farcaster", "farcaster_approval_timeout": "A aprovação do Farcaster expirou, por favor, tente novamente", "edit_autopost": "Editar autopost", "add_autopost_title": "Adicionar autopost", diff --git a/libraries/react-shared-libraries/src/translation/locales/ru/translation.json b/libraries/react-shared-libraries/src/translation/locales/ru/translation.json index 748d598333..532f03dee1 100644 --- a/libraries/react-shared-libraries/src/translation/locales/ru/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/ru/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "Ожидание вашего одобрения...", "farcaster_signer_revoked": "Одобрение Farcaster было отозвано, попробуйте ещё раз", "farcaster_signer_failed": "Не удалось запустить соединение с Farcaster", + "farcaster_scan_instructions": "Просканируйте QR-код с помощью телефона или скопируйте ссылку и откройте её на телефоне, затем подтвердите Postiz в приложении Farcaster.", + "farcaster_copy_link": "Скопировать ссылку Farcaster", "farcaster_approval_timeout": "Время ожидания одобрения Farcaster истекло, попробуйте ещё раз", "edit_autopost": "Редактировать автопост", "add_autopost_title": "Добавить автопост", diff --git a/libraries/react-shared-libraries/src/translation/locales/tr/translation.json b/libraries/react-shared-libraries/src/translation/locales/tr/translation.json index 053450a004..32b5af7077 100644 --- a/libraries/react-shared-libraries/src/translation/locales/tr/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/tr/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "Onayınızı bekliyoruz...", "farcaster_signer_revoked": "Farcaster onayı iptal edildi, lütfen tekrar deneyin", "farcaster_signer_failed": "Farcaster bağlantısı başlatılamadı", + "farcaster_scan_instructions": "QR kodunu telefonunla tara ya da bağlantıyı kopyalayıp telefonunda aç, ardından Farcaster uygulamasında Postiz'i onayla.", + "farcaster_copy_link": "Farcaster bağlantısını kopyala", "farcaster_approval_timeout": "Farcaster onayı zaman aşımına uğradı, lütfen tekrar deneyin", "edit_autopost": "Otomatik Gönderiyi Düzenle", "add_autopost_title": "Otomatik Gönderi Ekle", diff --git a/libraries/react-shared-libraries/src/translation/locales/vi/translation.json b/libraries/react-shared-libraries/src/translation/locales/vi/translation.json index 1c8443af12..4aac09315c 100644 --- a/libraries/react-shared-libraries/src/translation/locales/vi/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/vi/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "Đang chờ bạn phê duyệt...", "farcaster_signer_revoked": "Phê duyệt Farcaster đã bị thu hồi, vui lòng thử lại", "farcaster_signer_failed": "Không thể bắt đầu kết nối với Farcaster", + "farcaster_scan_instructions": "Quét mã QR bằng điện thoại của bạn, hoặc sao chép liên kết và mở nó trên điện thoại, sau đó phê duyệt Postiz trong ứng dụng Farcaster.", + "farcaster_copy_link": "Sao chép liên kết Farcaster", "farcaster_approval_timeout": "Phê duyệt Farcaster đã hết thời gian, vui lòng thử lại", "edit_autopost": "Chỉnh sửa tự động đăng", "add_autopost_title": "Thêm tự động đăng", diff --git a/libraries/react-shared-libraries/src/translation/locales/zh/translation.json b/libraries/react-shared-libraries/src/translation/locales/zh/translation.json index e7e9a89bcb..e3c218598e 100644 --- a/libraries/react-shared-libraries/src/translation/locales/zh/translation.json +++ b/libraries/react-shared-libraries/src/translation/locales/zh/translation.json @@ -582,6 +582,8 @@ "farcaster_waiting_for_approval": "正在等待您的批准...", "farcaster_signer_revoked": "Farcaster 的批准已被撤销,请重试", "farcaster_signer_failed": "无法启动 Farcaster 连接", + "farcaster_scan_instructions": "请使用手机扫描二维码,或复制链接并在手机上打开,然后在 Farcaster 应用中批准 Postiz。", + "farcaster_copy_link": "复制 Farcaster 链接", "farcaster_approval_timeout": "Farcaster 批准超时,请重试", "edit_autopost": "编辑自动发布", "add_autopost_title": "添加自动发布", From 73f5e2d1f39009cb15efff1037503669f00a32b9 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 15 Sep 2026 20:01:30 +0700 Subject: [PATCH 23/61] fix(sentry): sample traces and session replays to stay under quota Backend traces were sent at 100% (about 77M spans/day) and every browser session was recorded. Sample /public/v1/analytics/* at 1% and all other backend traces at 20%, frontend traces at 20% and session replays at 40%. Error events and error-session replays stay at 100%. Co-Authored-By: Claude Opus 5 (1M context) --- .../nestjs-libraries/src/sentry/initialize.sentry.ts | 9 ++++++++- .../src/sentry/initialize.sentry.client.ts | 2 +- .../src/sentry/initialize.sentry.next.basic.ts | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts b/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts index db20cff43f..14d67fea2f 100644 --- a/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts +++ b/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts @@ -55,7 +55,14 @@ export const initializeSentry = (appName: string, allowLogs = false) => { recordOutputs: true, }), ], - tracesSampleRate: 1.0, + tracesSampler: ({ name, attributes, normalizedRequest, inheritOrSampleWith }) => { + const path = String( + normalizedRequest?.url || attributes?.['http.target'] || attributes?.['url.path'] || name || '' + ); + return inheritOrSampleWith( + path.includes('/public/v1/analytics/') ? 0.01 : 0.2 + ); + }, enableLogs: true, // Profiling diff --git a/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts b/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts index 60c2317136..e17743092f 100644 --- a/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts +++ b/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts @@ -38,7 +38,7 @@ export const initializeSentryClient = (environment: string, dsn: string) => }), Sentry.replayCanvasIntegration(), ], - replaysSessionSampleRate: 1.0, + replaysSessionSampleRate: 0.4, replaysOnErrorSampleRate: 1.0, profilesSampleRate: environment === 'development' ? 1.0 : 0.75, diff --git a/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts b/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts index 9db747add9..47b047e2cf 100644 --- a/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts +++ b/libraries/react-shared-libraries/src/sentry/initialize.sentry.next.basic.ts @@ -49,7 +49,7 @@ export const initializeSentryBasic = (environment: string, dsn: string, extensio sendDefaultPii: true, ...extension, debug: environment === 'development', - tracesSampleRate: 1.0, + tracesSampleRate: 0.2, beforeSend(event, hint) { if (isWalletExtensionRejection(hint?.originalException)) { From f091f5449bed866f4fa73e52eaa7082ade21c7a9 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Wed, 16 Sep 2026 10:08:35 +0700 Subject: [PATCH 24/61] fix(media): open the Change Bot Picture media picker as a modal showMediaBox() rendered MediaBox through ShowMediaBoxModal as a plain in-flow div mounted near the top of the layout tree, with no overlay, no positioning and no z-index. Every other caller opens MediaBox through the modal manager instead, which is why the picker only misbehaved here. Since BotPicture is itself a fixed, full-viewport modal at z-index 200, the picker was laid out at the top of the document underneath it, and the modal manager force-applies overflow:hidden to body/html while a modal is open, so it could not even be scrolled to. Slack channels were the only ones affected in practice, as Slack is the only provider implementing changeProfilePicture, and the bot picture could not be changed at all. Route showMediaBox through modals.openModal with the same options MultiMediaComponent already uses, so the picker gets its own stack entry above the dialog that opened it. Its confirm button calls modals.closeCurrent(), which now closes the picker alone and leaves the Bot Picture dialog open with the chosen image applied; previously it ran outside any CurrentModalContext and closed nothing. MediaBox itself is unchanged, and the callback is narrowed to the picker's first selection to match the single-item shape the caller expects. Co-Authored-By: Claude Opus 5 (1M context) --- .../src/components/media/media.component.tsx | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index 2dbbd83fc1..901e9e5400 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -170,28 +170,30 @@ export const Pagination: FC<{ ); }; export const ShowMediaBoxModal: FC = () => { - const [showModal, setShowModal] = useState(false); - const [callBack, setCallBack] = - useState<(params: { id: string; path: string }[]) => void | undefined>(); - const closeModal = useCallback(() => { - setShowModal(false); - setCallBack(undefined); - }, []); + const modals = useModals(); + const t = useT(); useEffect(() => { showModalEmitter.on('show-modal', (cCallback) => { - setShowModal(true); - setCallBack(() => cCallback); + modals.openModal({ + title: t('media_library', 'Media Library'), + askClose: false, + closeOnEscape: true, + fullScreen: true, + size: 'calc(100% - 80px)', + height: 'calc(100% - 80px)', + children: (close) => ( + cCallback(media[0])} + closeModal={close} + /> + ), + }); }); return () => { showModalEmitter.removeAllListeners('show-modal'); }; }, []); - if (!showModal) return null; - return ( -
- -
- ); + return null; }; export const showMediaBox = ( callback: (params: { id: string; path: string }) => void From 0b26c98e64dcb4d41d58dffec7648f99e441131f Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 1 Sep 2026 18:58:25 +0700 Subject: [PATCH 25/61] fix(bluesky): only mark the channel disconnected on a 4xx login failure getAgent wrapped every agent.login error as RefreshToken, so a transient 5xx from Bluesky (seen in prod as a 502 UpstreamFailure from its load balancer) flagged the channel as needing reconnection and failed the following posts with "Refresh channel needed". Only a definite 4xx (excluding 429) now does that; other errors propagate and take the existing transient retry paths. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01PyDRJpL27E7WCK5UGsUope --- .../integrations/social/bluesky.provider.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts index 90cb502f5d..4efd91c26d 100644 --- a/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/bluesky.provider.ts @@ -371,8 +371,22 @@ export class BlueskyProvider extends SocialAbstract implements SocialProvider { identifier: body.identifier, password: body.password, }); - } catch (err) { - throw new RefreshToken('bluesky', JSON.stringify(err), {} as BodyInit); + } catch (err: any) { + // Only a definite 4xx (bad password, account taken down) means the + // credentials are broken. A 5xx or network error is Bluesky being + // unavailable: let it propagate as a transient failure instead of + // marking the channel as disconnected. + const status = err?.status; + if ( + typeof status === 'number' && + status >= 400 && + status < 500 && + status !== 429 + ) { + throw new RefreshToken('bluesky', JSON.stringify(err), {} as BodyInit); + } + + throw err; } return agent; From ed721b4f40414a44896c80e945879ceba5af2826 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 1 Sep 2026 18:58:25 +0700 Subject: [PATCH 26/61] fix(frontend): reconnect custom-fields channels through the credentials modal refreshChannel redirected to the url returned by /integrations/social/:id?refresh=..., which for custom-fields providers (Bluesky etc.) is the random state string rather than an OAuth page, so the click landed on a 404. Open the CustomVariables modal the channel menu already uses for those providers instead. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01PyDRJpL27E7WCK5UGsUope --- .../launches/launches.component.tsx | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/components/launches/launches.component.tsx b/apps/frontend/src/components/launches/launches.component.tsx index 8544a3e77f..bb8d9ce6d7 100644 --- a/apps/frontend/src/components/launches/launches.component.tsx +++ b/apps/frontend/src/components/launches/launches.component.tsx @@ -1,6 +1,9 @@ 'use client'; -import { AddProviderButton } from '@gitroom/frontend/components/launches/add.provider.component'; +import { + AddProviderButton, + CustomVariables, +} from '@gitroom/frontend/components/launches/add.provider.component'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import SafeImage from '@gitroom/react/helpers/safe.image'; import { capitalize, groupBy, orderBy } from 'lodash'; @@ -26,6 +29,7 @@ import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { useIntegrationList } from '@gitroom/frontend/components/launches/helpers/use.integration.list'; import useCookie from 'react-use-cookie'; import { Onboarding } from '@gitroom/frontend/components/onboarding/onboarding'; +import { useModals } from '@gitroom/frontend/components/layout/new-modal'; export const SVGLine = () => { return ( @@ -358,6 +362,7 @@ export const LaunchesComponent = () => { const toast = useToaster(); const fireEvents = useFireEvents(); const t = useT(); + const modal = useModals(); const [reload, setReload] = useState(false); const [collapseMenu, setCollapseMenu] = useCookie('collapseMenu', '0'); const [mode] = useCookie('mode', 'dark'); @@ -441,9 +446,31 @@ export const LaunchesComponent = () => { ( integration: Integration & { identifier: string; + isCustomFields?: boolean; + customFields?: any[]; } ) => async () => { + // Custom-fields providers (Bluesky, etc.) have no OAuth URL to redirect + // to: reconnect by re-entering the credentials, like the menu does. + if (integration.isCustomFields) { + modal.openModal({ + title: t('custom_url', 'Custom URL'), + withCloseButton: false, + classNames: { + modal: 'md', + }, + children: ( + router.push(url)} + variables={integration.customFields || []} + /> + ), + }); + return; + } + const { url } = await ( await fetch( `/integrations/social/${integration.identifier}?refresh=${integration.internalId}`, From 19f095f338454d18b42fc92890a1eea4b672dd27 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Wed, 16 Sep 2026 08:10:54 +0200 Subject: [PATCH 27/61] fix(sentry): lower profiling even further --- libraries/nestjs-libraries/src/sentry/initialize.sentry.ts | 2 +- .../src/sentry/initialize.sentry.client.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts b/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts index 14d67fea2f..20c817ac5a 100644 --- a/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts +++ b/libraries/nestjs-libraries/src/sentry/initialize.sentry.ts @@ -66,7 +66,7 @@ export const initializeSentry = (appName: string, allowLogs = false) => { enableLogs: true, // Profiling - profileSessionSampleRate: process.env.NODE_ENV === 'development' ? 1.0 : 0.3, + profileSessionSampleRate: process.env.NODE_ENV === 'development' ? 1.0 : 0.2, profileLifecycle: 'trace', }); } catch (err) { diff --git a/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts b/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts index e17743092f..48016b1fd6 100644 --- a/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts +++ b/libraries/react-shared-libraries/src/sentry/initialize.sentry.client.ts @@ -41,5 +41,5 @@ export const initializeSentryClient = (environment: string, dsn: string) => replaysSessionSampleRate: 0.4, replaysOnErrorSampleRate: 1.0, - profilesSampleRate: environment === 'development' ? 1.0 : 0.75, + profilesSampleRate: environment === 'development' ? 1.0 : 0.60, }); From b193042126cf624398384b12196628ddc0ccf25c Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Wed, 16 Sep 2026 13:34:03 +0700 Subject: [PATCH 28/61] fix: resolve the webhook post by releaseId fallback The workflows pass the platform's post id to sendWebhooks, so the DB-id lookup matched nothing and every webhook body was []. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01JkiuuMQcG1QRkbagfSkBtb --- .../src/activities/post.activity.ts | 5 +- .../database/prisma/posts/posts.repository.ts | 56 +++++++++++++------ .../database/prisma/posts/posts.service.ts | 4 +- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/apps/orchestrator/src/activities/post.activity.ts b/apps/orchestrator/src/activities/post.activity.ts index 271213f2aa..5c18c34759 100644 --- a/apps/orchestrator/src/activities/post.activity.ts +++ b/apps/orchestrator/src/activities/post.activity.ts @@ -498,7 +498,10 @@ export class PostActivity { return; } - const post = await this._postService.getPostByForWebhookId(postId); + const post = await this._postService.getPostByForWebhookId( + postId, + integrationId + ); await Promise.all( webhooks.map(async (webhook) => { try { diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts index 4d6e240f6a..5741b6a966 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -884,29 +884,51 @@ export class PostsRepository { }); } - async getPostByForWebhookId(postId: string) { - return this._post.model.post.findMany({ + async getPostByForWebhookId(postId: string, integrationId: string) { + const select = { + id: true, + content: true, + publishDate: true, + releaseURL: true, + state: true, + integration: { + select: { + id: true, + name: true, + providerIdentifier: true, + picture: true, + type: true, + }, + }, + }; + + const posts = await this._post.model.post.findMany({ where: { id: postId, deletedAt: null, parentPostId: null, }, - select: { - id: true, - content: true, - publishDate: true, - releaseURL: true, - state: true, - integration: { - select: { - id: true, - name: true, - providerIdentifier: true, - picture: true, - type: true, - }, - }, + select, + }); + + if (posts.length) { + return posts; + } + + // The running workflows pass the platform's post id, which updatePost + // already stored on the row as releaseId before the webhook is sent. + return this._post.model.post.findMany({ + where: { + releaseId: postId, + integrationId, + deletedAt: null, + parentPostId: null, + }, + orderBy: { + updatedAt: 'desc' as const, }, + take: 1, + select, }); } diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index cff3bb38be..fd60fb59be 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -688,8 +688,8 @@ export class PostsService { return this._postRepository.countPostsFromDay(orgId, date); } - getPostByForWebhookId(id: string) { - return this._postRepository.getPostByForWebhookId(id); + getPostByForWebhookId(id: string, integrationId: string) { + return this._postRepository.getPostByForWebhookId(id, integrationId); } async startWorkflow( From a9aced7d8a7faf0bce7f3aa125ffd3716ed1eda0 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 23 Jul 2026 17:04:33 +0700 Subject: [PATCH 29/61] fix(instagram): send collaborators on carousel container instead of child items IG's Graph API rejects the collaborators param on carousel child media (is_carousel_item=true) with "param collaborators is not allowed", which Postiz surfaced as "Collaborators are not allowed for carousel". Meta supports collaborators on the parent media_type=CAROUSEL container, so the param now goes there; single-media posts keep it on the media call, stories still never send it. Fixes #1547 Co-Authored-By: Claude Fable 5 --- .../integrations/social/instagram.provider.ts | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index ca1d26b1ee..2cbc2bfb89 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -664,6 +664,12 @@ export class InstagramProvider const [accessToken] = token.split('___'); const [firstPost] = postDetails; const isStory = firstPost.settings.post_type === 'story'; + const collaborators = + firstPost?.settings?.collaborators?.length && !isStory + ? `&collaborators=${JSON.stringify( + firstPost?.settings?.collaborators.map((p) => p.label) + )}` + : ``; const isTrialReel = this.assetBoolean(firstPost.settings.is_trial_reel); const medias = await Promise.all( firstPost?.media?.map(async (m) => { @@ -700,12 +706,10 @@ export class InstagramProvider )}` : ``; - const collaborators = - firstPost?.settings?.collaborators?.length && !isStory - ? `&collaborators=${JSON.stringify( - firstPost?.settings?.collaborators.map((p) => p.label) - )}` - : ``; + // collaborators are not allowed on carousel child items, + // they go on the carousel container instead + const itemCollaborators = + firstPost?.media?.length === 1 ? collaborators : ``; // audio_configuration is only supported for Reels (single video, not a story) // and only with Facebook Login (not Instagram Login / graph.instagram.com) @@ -732,7 +736,7 @@ export class InstagramProvider const { id: photoId } = await ( await this.fetch( - `https://${type}/${META_GRAPH_API_VERSION}/${id}/media?${mediaType}${isCarousel}${collaborators}${trialParams}${audioConfiguration}&access_token=${accessToken}${caption}`, + `https://${type}/${META_GRAPH_API_VERSION}/${id}/media?${mediaType}${isCarousel}${itemCollaborators}${trialParams}${audioConfiguration}&access_token=${accessToken}${caption}`, { method: 'POST', } @@ -762,6 +766,13 @@ export class InstagramProvider : 'carousel', containers: medias, message: firstPost?.message || '', + ...(collaborators + ? { + collaborators: firstPost.settings.collaborators!.map( + (p) => p.label + ), + } + : {}), }, }, ]; @@ -775,6 +786,7 @@ export class InstagramProvider containers: string[]; message?: string; carouselId?: string; + collaborators?: string[]; }, integration: Integration ): Promise { @@ -841,6 +853,7 @@ export class InstagramProvider containers: string[]; message?: string; carouselId?: string; + collaborators?: string[]; }, integration: Integration ): Promise { @@ -897,7 +910,11 @@ export class InstagramProvider pendingData.message || '' )}&media_type=CAROUSEL&children=${encodeURIComponent( pendingData.containers.join(',') - )}&access_token=${accessToken}`, + )}${ + pendingData.collaborators?.length + ? `&collaborators=${JSON.stringify(pendingData.collaborators)}` + : `` + }&access_token=${accessToken}`, { method: 'POST', } From 0a8c28fbd9a5d559dcc71fa25049bceb64bc1280 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Thu, 23 Jul 2026 18:21:25 +0700 Subject: [PATCH 30/61] fix(instagram): url-encode collaborators param Consistent with trial_params and audio_configuration in the same file. Co-Authored-By: Claude Fable 5 --- .../src/integrations/social/instagram.provider.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 2cbc2bfb89..134dc43c4d 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -666,8 +666,10 @@ export class InstagramProvider const isStory = firstPost.settings.post_type === 'story'; const collaborators = firstPost?.settings?.collaborators?.length && !isStory - ? `&collaborators=${JSON.stringify( - firstPost?.settings?.collaborators.map((p) => p.label) + ? `&collaborators=${encodeURIComponent( + JSON.stringify( + firstPost?.settings?.collaborators.map((p) => p.label) + ) )}` : ``; const isTrialReel = this.assetBoolean(firstPost.settings.is_trial_reel); @@ -912,7 +914,9 @@ export class InstagramProvider pendingData.containers.join(',') )}${ pendingData.collaborators?.length - ? `&collaborators=${JSON.stringify(pendingData.collaborators)}` + ? `&collaborators=${encodeURIComponent( + JSON.stringify(pendingData.collaborators) + )}` : `` }&access_token=${accessToken}`, { From 1de1537041943b2663197e54bcaa5e2a6be58916 Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Tue, 25 Aug 2026 19:08:53 +0700 Subject: [PATCH 31/61] fix(instagram): strip leading @ from collaborator handles Instagram's media container endpoint rejects collaborator handles that carry a leading @ with OAuthException code 110 / error_subcode 2207018 ("Cannot load user with a private profile or invalid username"). The collaborator tag input stores the text the user typed verbatim, so anyone who types the handle the way Instagram displays it hits this and the post fails with an unactionable "Unknown Error". Both the child/single container URL and the collaborators carried on pendingData for the carousel container are normalised, so feed posts and carousels behave the same. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01ViUCQXeeNpPneJH15kDk3k --- .../src/integrations/social/instagram.provider.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 134dc43c4d..f8c9aa08cb 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -605,6 +605,12 @@ export class InstagramProvider }; } + // Instagram rejects collaborator handles that carry a leading @ with + // error_subcode 2207018, and the tag input stores whatever the user typed. + private stripHandle(handle: string) { + return handle.replace(/^@+/, ''); + } + // Single, read-only status check of a media container - the polling loops // that used to live inside post() are now driven by the post workflow. private async igContainerStatus( @@ -668,7 +674,9 @@ export class InstagramProvider firstPost?.settings?.collaborators?.length && !isStory ? `&collaborators=${encodeURIComponent( JSON.stringify( - firstPost?.settings?.collaborators.map((p) => p.label) + firstPost?.settings?.collaborators.map((p) => + this.stripHandle(p.label) + ) ) )}` : ``; @@ -770,8 +778,8 @@ export class InstagramProvider message: firstPost?.message || '', ...(collaborators ? { - collaborators: firstPost.settings.collaborators!.map( - (p) => p.label + collaborators: firstPost.settings.collaborators!.map((p) => + this.stripHandle(p.label) ), } : {}), From e2d5b9c59269da0f852ee54d103ddb8615d48378 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 16 Sep 2026 16:12:07 +0700 Subject: [PATCH 32/61] feat: runpod --- .env.example | 5 + .../src/api/routes/media.controller.ts | 10 +- apps/frontend/src/app/(app)/layout.tsx | 5 + apps/frontend/src/app/(extension)/layout.tsx | 5 + apps/frontend/src/app/(provider)/layout.tsx | 5 + .../src/components/media/new.uploader.tsx | 41 +++- .../src/activities/media.activity.ts | 26 ++ apps/orchestrator/src/app.module.ts | 2 + apps/orchestrator/src/workflows/index.ts | 1 + .../src/workflows/process.media.workflow.ts | 66 +++++ .../database/prisma/media/media.repository.ts | 50 ++++ .../database/prisma/media/media.service.ts | 226 ++++++++++++++++++ .../database/prisma/posts/posts.service.ts | 14 +- .../src/database/prisma/schema.prisma | 2 + .../src/upload/cloudflare.storage.ts | 23 +- .../src/upload/media.processor.interface.ts | 69 ++++++ .../src/upload/r2.uploader.ts | 21 +- .../src/upload/runpod.media.processor.ts | 66 +++++ .../src/upload/upload.factory.ts | 22 ++ .../src/upload/upload.interface.ts | 4 + .../src/helpers/uppy.upload.ts | 104 ++++++++ .../src/helpers/variable.context.tsx | 2 + 22 files changed, 756 insertions(+), 13 deletions(-) create mode 100644 apps/orchestrator/src/activities/media.activity.ts create mode 100644 apps/orchestrator/src/workflows/process.media.workflow.ts create mode 100644 libraries/nestjs-libraries/src/upload/media.processor.interface.ts create mode 100644 libraries/nestjs-libraries/src/upload/runpod.media.processor.ts diff --git a/.env.example b/.env.example index dd83c15a5b..b5d0cd21ee 100644 --- a/.env.example +++ b/.env.example @@ -19,6 +19,11 @@ CLOUDFLARE_SECRET_ACCESS_KEY="your-secret-access-key" CLOUDFLARE_BUCKETNAME="your-bucket-name" CLOUDFLARE_BUCKET_URL="https://your-bucket-url.r2.cloudflarestorage.com/" CLOUDFLARE_REGION="auto" +## Optional media normalization (postiz-uploader on RunPod Serverless). Requires STORAGE_PROVIDER="cloudflare". +## When set, web uploads are transcoded to 1080p h264 mp4 / downsized images in the background; +## the media record reports status "processing" until the normalized file replaces the original. +#RUNPOD_API_KEY="" +#RUNPOD_ENDPOINT_ID="" # === Common optional Settings diff --git a/apps/backend/src/api/routes/media.controller.ts b/apps/backend/src/api/routes/media.controller.ts index 6d5b557a1f..f942c10f3a 100644 --- a/apps/backend/src/api/routes/media.controller.ts +++ b/apps/backend/src/api/routes/media.controller.ts @@ -167,7 +167,7 @@ export class MediaController { const name = upload.Location.split('/').pop(); const originalName = req.body?.file?.name; - const saveFile = await this._mediaService.saveFile( + const saveFile = await this._mediaService.saveUploadedFile( org.id, name, // @ts-ignore @@ -178,6 +178,14 @@ export class MediaController { res.status(200).json({ ...upload, saved: saveFile }); } + @Get('/:id/status') + getMediaStatus( + @GetOrgFromRequest() org: Organization, + @Param('id') id: string + ) { + return this._mediaService.getMediaStatus(org.id, id); + } + @Get('/') getMedia( @GetOrgFromRequest() org: Organization, diff --git a/apps/frontend/src/app/(app)/layout.tsx b/apps/frontend/src/app/(app)/layout.tsx index ae83325be3..cc1cc4ff85 100644 --- a/apps/frontend/src/app/(app)/layout.tsx +++ b/apps/frontend/src/app/(app)/layout.tsx @@ -87,6 +87,11 @@ export default async function AppLayout({ children }: { children: ReactNode }) { googleAdsId={process.env.NEXT_PUBLIC_GTM_ID} googleAdsTrialTracking={process.env.NEXT_PUBLIC_TRACKING_TRIAL} language={language} + mediaProcessing={ + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + } transloadit={ process.env.TRANSLOADIT_AUTH && process.env.TRANSLOADIT_TEMPLATE ? [ diff --git a/apps/frontend/src/app/(extension)/layout.tsx b/apps/frontend/src/app/(extension)/layout.tsx index b5990cb47c..db1fe6d7e6 100644 --- a/apps/frontend/src/app/(extension)/layout.tsx +++ b/apps/frontend/src/app/(extension)/layout.tsx @@ -55,6 +55,11 @@ export default async function AppLayout({ children }: { children: ReactNode }) { disableXAnalytics={!!process.env.DISABLE_X_ANALYTICS} sentryDsn={process.env.NEXT_PUBLIC_SENTRY_DSN!} extensionId={process.env.EXTENSION_ID || ''} + mediaProcessing={ + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + } transloadit={ process.env.TRANSLOADIT_AUTH && process.env.TRANSLOADIT_TEMPLATE ? [ diff --git a/apps/frontend/src/app/(provider)/layout.tsx b/apps/frontend/src/app/(provider)/layout.tsx index 80f161f8af..149f45b281 100644 --- a/apps/frontend/src/app/(provider)/layout.tsx +++ b/apps/frontend/src/app/(provider)/layout.tsx @@ -57,6 +57,11 @@ export default async function AppLayout({ children }: { children: ReactNode }) { disableXAnalytics={!!process.env.DISABLE_X_ANALYTICS} sentryDsn={process.env.NEXT_PUBLIC_SENTRY_DSN!} extensionId={process.env.EXTENSION_ID || ''} + mediaProcessing={ + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + } transloadit={ process.env.TRANSLOADIT_AUTH && process.env.TRANSLOADIT_TEMPLATE ? [ diff --git a/apps/frontend/src/components/media/new.uploader.tsx b/apps/frontend/src/components/media/new.uploader.tsx index cde95e738a..532dc0132a 100644 --- a/apps/frontend/src/components/media/new.uploader.tsx +++ b/apps/frontend/src/components/media/new.uploader.tsx @@ -3,7 +3,10 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import Uppy, { BasePlugin, UploadResult, UppyFile } from '@uppy/core'; // @ts-ignore import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; -import { getUppyUploadPlugin } from '@gitroom/react/helpers/uppy.upload'; +import { + getUppyUploadPlugin, + WaitForMediaProcessing, +} from '@gitroom/react/helpers/uppy.upload'; import { Dashboard, FileInput, ProgressBar } from '@uppy/react'; // Uppy styles @@ -44,8 +47,14 @@ export function useUppyUploader(props: { }) { const setLocked = useLaunchStore((state) => state.setLocked); const toast = useToaster(); - const { storageProvider, backendUrl, disableImageCompression, transloadit } = - useVariables(); + const t = useT(); + const { + storageProvider, + backendUrl, + disableImageCompression, + transloadit, + mediaProcessing, + } = useVariables(); const { onUploadSuccess, allowedFileTypes } = props; const fetch = useFetch(); return useMemo(() => { @@ -84,6 +93,10 @@ export function useUppyUploader(props: { if (type === 'video/*') { return ['video/mp4', 'video/mpeg', 'video/quicktime']; } + // the normalizer turns QuickTime into mp4, nothing else is accepted by the bucket + if (type === 'video/mp4' && mediaProcessing) { + return ['video/mp4', 'video/quicktime']; + } if (type === 'video/mp4' && transloadit && transloadit.length > 0) { return ['video/mp4', 'video/mpeg', 'video/quicktime']; } @@ -167,15 +180,31 @@ export function useUppyUploader(props: { }); }); + // The normalizer takes precedence over Transloadit, so both can stay + // configured and turning the normalizer off falls back to Transloadit + const useTransloadit = !mediaProcessing && transloadit.length > 0; const { plugin, options } = getUppyUploadPlugin( - transloadit.length > 0 ? 'transloadit' : storageProvider, + useTransloadit ? 'transloadit' : storageProvider, fetch, backendUrl, transloadit ); uppy2.use(plugin, options); - if (!disableImageCompression) { + // installed whenever the record can come back "processing", so the backend + // decides; it passes files through untouched when the row is already ready + if (storageProvider === 'cloudflare' && !useTransloadit) { + uppy2.use(WaitForMediaProcessing, { + fetch, + processingMessage: t('processing', 'Processing...'), + fallbackMessage: t( + 'could_not_optimize_file', + 'Could not optimize the file, the original will be used' + ), + }); + } + // the normalizer resizes on the server, shrinking first would only make it upscale a blurry copy + if (!disableImageCompression && !mediaProcessing) { uppy2.use(CompressionWrapper, { convertTypes: ['image/jpeg', 'image/png', 'image/webp'], maxWidth: 1000, @@ -222,7 +251,7 @@ export function useUppyUploader(props: { return; } - if (transloadit.length > 0) { + if (useTransloadit) { // @ts-ignore const allRes = result.transloadit[0].results; const toSave = uniqBy<{ name: string; originalName: string; order: number }>( diff --git a/apps/orchestrator/src/activities/media.activity.ts b/apps/orchestrator/src/activities/media.activity.ts new file mode 100644 index 0000000000..beff47318f --- /dev/null +++ b/apps/orchestrator/src/activities/media.activity.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { Activity, ActivityMethod } from 'nestjs-temporal-core'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; + +@Injectable() +@Activity() +export class MediaActivity { + constructor(private _mediaService: MediaService) {} + + // Returns the processor job id, or null when there is nothing to process + @ActivityMethod() + async submitMediaProcessing(mediaId: string) { + return this._mediaService.submitProcessing(mediaId); + } + + // Returns true once the media record is final (ready or failed) + @ActivityMethod() + async checkMediaProcessing(mediaId: string, jobId: string) { + return this._mediaService.checkProcessing(mediaId, jobId); + } + + @ActivityMethod() + async failMediaProcessing(mediaId: string, error: string) { + return this._mediaService.failProcessing(mediaId, error); + } +} diff --git a/apps/orchestrator/src/app.module.ts b/apps/orchestrator/src/app.module.ts index e2707b93ce..4c0af35bca 100644 --- a/apps/orchestrator/src/app.module.ts +++ b/apps/orchestrator/src/app.module.ts @@ -6,6 +6,7 @@ import { AutopostService } from '@gitroom/nestjs-libraries/database/prisma/autop import { EmailActivity } from '@gitroom/orchestrator/activities/email.activity'; import { IntegrationsActivity } from '@gitroom/orchestrator/activities/integrations.activity'; import { VideoActivity } from '@gitroom/orchestrator/activities/video.activity'; +import { MediaActivity } from '@gitroom/orchestrator/activities/media.activity'; import { VideoModule } from '@gitroom/nestjs-libraries/videos/video.module'; import { HealthController } from '@gitroom/orchestrator/health.controller'; @@ -15,6 +16,7 @@ const activities = [ EmailActivity, IntegrationsActivity, VideoActivity, + MediaActivity, ]; @Module({ imports: [ diff --git a/apps/orchestrator/src/workflows/index.ts b/apps/orchestrator/src/workflows/index.ts index a949c98937..4d902a0177 100644 --- a/apps/orchestrator/src/workflows/index.ts +++ b/apps/orchestrator/src/workflows/index.ts @@ -17,3 +17,4 @@ export * from './send.email.workflow'; export * from './refresh.token.workflow'; export * from './streak.workflow'; export * from './generate.video.workflow'; +export * from './process.media.workflow'; diff --git a/apps/orchestrator/src/workflows/process.media.workflow.ts b/apps/orchestrator/src/workflows/process.media.workflow.ts new file mode 100644 index 0000000000..7b6b30614b --- /dev/null +++ b/apps/orchestrator/src/workflows/process.media.workflow.ts @@ -0,0 +1,66 @@ +import { ActivityFailure, proxyActivities, sleep } from '@temporalio/workflow'; +import { MediaActivity } from '@gitroom/orchestrator/activities/media.activity'; + +// Submitting is a plain POST with no idempotency key, so a retry after the +// queue accepted the job would run it twice; one attempt, and a failure +// releases the media instead +const { submitMediaProcessing } = proxyActivities({ + startToCloseTimeout: '2 minute', + taskQueue: 'main', + retry: { + maximumAttempts: 1, + }, +}); + +// Polling is idempotent: ride out a queue API outage of a few minutes. +// Terminal answers are recorded by the activity itself and never throw +const { checkMediaProcessing, failMediaProcessing } = + proxyActivities({ + startToCloseTimeout: '2 minute', + taskQueue: 'main', + retry: { + maximumAttempts: 10, + backoffCoefficient: 2, + initialInterval: '10 seconds', + maximumInterval: '2 minutes', + }, + }); + +// the workflow only sees the activity failure wrapper; the reason is its cause +const reason = (err: any, fallback: string) => + (err instanceof ActivityFailure ? err.cause?.message : err?.message) || + fallback; + +// Polls a job on the media normalization service; the service has no callbacks, +// and the RunPod job TTL is one hour so polling past it is pointless +const POLL_INTERVAL = 5000; +const MAX_POLLS = (60 * 60 * 1000) / POLL_INTERVAL; + +export async function processMediaWorkflow({ mediaId }: { mediaId: string }) { + let jobId: string | null; + try { + jobId = await submitMediaProcessing(mediaId); + } catch (err: any) { + await failMediaProcessing(mediaId, reason(err, 'Could not submit job')); + return; + } + + // nothing to run: the activity already released the media as ready + if (!jobId) { + return; + } + + for (let i = 0; i < MAX_POLLS; i++) { + await sleep(POLL_INTERVAL); + try { + if (await checkMediaProcessing(mediaId, jobId)) { + return; + } + } catch (err: any) { + await failMediaProcessing(mediaId, reason(err, 'Could not check job')); + return; + } + } + + await failMediaProcessing(mediaId, 'Processing timed out'); +} diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts index 208def20f6..7f05d20b39 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.repository.ts @@ -25,6 +25,53 @@ export class MediaRepository { path: true, thumbnail: true, alt: true, + status: true, + }, + }); + } + + startProcessing(org: string, id: string) { + return this._media.model.media.update({ + where: { id, organizationId: org }, + data: { status: 'processing', processingError: null }, + select: { id: true, status: true }, + }); + } + + finishProcessing( + org: string, + id: string, + data: { name?: string; path?: string; fileSize?: number; error?: string } + ) { + return this._media.model.media.update({ + where: { id, organizationId: org }, + data: { + ...(data.name ? { name: data.name } : {}), + ...(data.path ? { path: data.path } : {}), + ...(data.fileSize ? { fileSize: data.fileSize } : {}), + status: data.error ? 'failed' : 'ready', + processingError: data.error || null, + }, + select: { id: true, status: true }, + }); + } + + getMediaStatus(org: string, id: string) { + return this._media.model.media.findFirst({ + where: { + id, + organizationId: org, + deletedAt: null, + }, + select: { + id: true, + name: true, + originalName: true, + path: true, + thumbnail: true, + alt: true, + status: true, + processingError: true, }, }); } @@ -89,6 +136,7 @@ export class MediaRepository { id: org, }, deletedAt: null, + status: { not: 'processing' }, ...searchFilter, }, }; @@ -97,6 +145,8 @@ export class MediaRepository { where: { organizationId: org, deletedAt: null, + // still being normalized: it shows up once the workflow releases it + status: { not: 'processing' }, ...searchFilter, }, orderBy: { diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts index c56534b85e..307f70c644 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts @@ -17,10 +17,57 @@ import { TemporalService } from 'nestjs-temporal-core'; import { TypedSearchAttributes } from '@temporalio/common'; import { organizationId } from '@gitroom/nestjs-libraries/temporal/temporal.search.attribute'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { MediaProcessorJob } from '@gitroom/nestjs-libraries/upload/media.processor.interface'; +import { extname } from 'path'; + +// What every upload is normalized to before a provider ever sees it. The +// service applies exactly these, so a platform-specific need belongs in the +// provider, not here. +const VIDEO_RULES: MediaProcessorJob['rules'] = { + short_side_min: 1080, + short_side_max: 1080, + long_side_max: 1920, + video: { + container: 'mp4', + video_codec: 'h264', + profile: 'high', + pixel_format: 'yuv420p', + fps_max: 60, + quality: 23, + audio_codec: 'aac', + audio_bitrate_kbps: 128, + audio_sample_rate: 48000, + faststart: true, + }, +}; +const IMAGE_RULES: MediaProcessorJob['rules'] = { + short_side_min: 1, + short_side_max: 1080, + long_side_max: 1920, + image: { jpeg_quality: 90, keep_format: true }, +}; +const LIMITS: MediaProcessorJob['limits'] = { + max_input_bytes: 1073741824, + max_duration_seconds: 900, + timeout_seconds: 1200, +}; +// Extension of the normalized file and the content type the presigned PUT is +// minted for; anything else (gif, avif, ...) is stored as uploaded +const PROCESSABLE: Record = { + '.mp4': { type: 'video', ext: 'mp4', contentType: 'video/mp4' }, + '.mov': { type: 'video', ext: 'mp4', contentType: 'video/mp4' }, + '.jpg': { type: 'image', ext: 'jpg', contentType: 'image/jpeg' }, + '.jpeg': { type: 'image', ext: 'jpg', contentType: 'image/jpeg' }, + '.png': { type: 'image', ext: 'png', contentType: 'image/png' }, + '.webp': { type: 'image', ext: 'webp', contentType: 'image/webp' }, +}; +// Formats a post can carry without normalization; anything else only exists to be converted +const USABLE_AS_IS = new Set(['.mp4', '.jpg', '.jpeg', '.png', '.webp', '.gif']); @Injectable() export class MediaService { private storage = UploadFactory.createStorage(); + private processor = UploadFactory.createProcessor(); constructor( private _mediaRepository: MediaRepository, @@ -66,6 +113,185 @@ export class MediaService { return this._mediaRepository.saveFile(org, fileName, filePath, originalName); } + // Saves an upload and, when a normalizer is configured, hands it to the + // processing workflow; the caller polls getMediaStatus until it is ready + async saveUploadedFile( + org: string, + fileName: string, + filePath: string, + originalName?: string + ) { + const media = await this.saveFile(org, fileName, filePath, originalName); + const client = this._temporalService.client.getRawClient(); + if (!this.processor || !PROCESSABLE[extname(fileName).toLowerCase()] || !client) { + return media; + } + + await this._mediaRepository.startProcessing(org, media.id); + try { + await client.workflow.start('processMediaWorkflow', { + workflowId: `media_${media.id}`, + taskQueue: 'main', + args: [{ mediaId: media.id }], + typedSearchAttributes: new TypedSearchAttributes([ + { + key: organizationId, + value: org, + }, + ]), + }); + } catch (err) { + // no workflow means nothing will ever flip the status + return this.releaseUnprocessed(org, media.id, media.name); + } + + return { ...media, status: 'processing' }; + } + + // Lets go of a media the normalizer will not touch. A source the platforms + // accept as-is (mp4, png, ...) becomes ready; one that only exists to be + // converted (mov) is failed, since nothing downstream can use it + private async releaseUnprocessed(org: string, id: string, name: string) { + const convertOnly = !USABLE_AS_IS.has(extname(name).toLowerCase()); + await this._mediaRepository.finishProcessing(org, id, { + ...(convertOnly + ? { error: 'No media processor is available to convert this file' } + : {}), + }); + return this._mediaRepository.getMediaStatus(org, id); + } + + async getMediaStatus(org: string, id: string) { + const media = await this._mediaRepository.getMediaStatus(org, id); + if (!media) { + throw new HttpException('Media not found', 404); + } + + return media; + } + + // The normalized file sits next to the original under a derived key, so the + // polling side needs nothing but the media record to know where it landed + private normalizedName(name: string) { + const ext = extname(name).toLowerCase(); + return `${name.slice(0, -ext.length)}-n.${PROCESSABLE[ext].ext}`; + } + + // Returns the processor job id; when this process has nothing to run the + // media (already marked processing by the upload) is released as ready, so + // a worker without the processor configured never leaves an upload hanging + async submitProcessing(mediaId: string) { + const media = await this._mediaRepository.getMediaById(mediaId); + if (!media) { + return null; + } + + const processable = PROCESSABLE[extname(media.name).toLowerCase()]; + if ( + !this.processor || + !processable || + !this.storage.signDownloadUrl || + !this.storage.signUploadUrl + ) { + await this.releaseUnprocessed(media.organizationId, media.id, media.name); + return null; + } + + const outputName = this.normalizedName(media.name); + return this.processor.submit({ + version: 1, + type: processable.type, + reference: media.id, + source: { url: await this.storage.signDownloadUrl(media.name) }, + output: { + url: await this.storage.signUploadUrl(outputName, processable.contentType), + content_type: processable.contentType, + }, + rules: processable.type === 'video' ? VIDEO_RULES : IMAGE_RULES, + limits: LIMITS, + }); + } + + // Returns true once the record is final. A transport error throws so the + // activity retries the poll; a terminal answer from the queue or the service + // marks the media failed and keeps the original usable + async checkProcessing(mediaId: string, jobId: string) { + const media = await this._mediaRepository.getMediaById(mediaId); + if (!media) { + return true; + } + + // a retried activity after the record was already finalized must not + // derive the output key a second time from the rewritten name + if (media.status !== 'processing') { + return true; + } + + const org = media.organizationId; + if (!this.processor) { + await this.releaseUnprocessed(org, mediaId, media.name); + return true; + } + + const job = await this.processor.status(jobId); + if (job.status === 'pending') { + return false; + } + + if (job.status === 'failed') { + await this._mediaRepository.finishProcessing(org, mediaId, { + error: job.error, + }); + return true; + } + + const { result } = job; + if (!result || !['completed', 'unchanged', 'failed'].includes(result.status)) { + await this._mediaRepository.finishProcessing(org, mediaId, { + error: `Unexpected processor result: ${JSON.stringify(result).slice(0, 500)}`, + }); + return true; + } + + if (result.status === 'failed') { + // the stderr tail is the only way to know what ffmpeg objected to + await this._mediaRepository.finishProcessing(org, mediaId, { + error: [ + `${result.failure?.code || 'FAILED'}: ${result.failure?.message || ''}`, + result.failure?.stderr_tail, + ] + .filter(Boolean) + .join('\n') + .slice(0, 4000), + }); + return true; + } + + if (result.status === 'unchanged') { + await this._mediaRepository.finishProcessing(org, mediaId, {}); + return true; + } + + const outputName = this.normalizedName(media.name); + await this._mediaRepository.finishProcessing(org, mediaId, { + name: outputName, + path: media.path.slice(0, media.path.lastIndexOf('/') + 1) + outputName, + fileSize: result.output?.bytes, + }); + return true; + } + + async failProcessing(mediaId: string, error: string) { + const media = await this._mediaRepository.getMediaById(mediaId); + if (!media) { + return; + } + + return this._mediaRepository.finishProcessing(media.organizationId, mediaId, { + error, + }); + } + getMedia(org: string, page: number, search?: string) { return this._mediaRepository.getMedia(org, page, search); } diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 13e684f813..592ebde932 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -349,11 +349,23 @@ export class PostsService { ( await Promise.all( (imagesList || []).map(async (p: any) => { - if (!p.path && p.id) { + if (!p.id) { + return p; + } + + if (!p.path) { imageUpdateNeeded = true; return this._mediaService.getMediaById(p.id); } + // the normalizer may have replaced the file after the post was + // composed; a record still processing publishes the original + const fresh = await this._mediaService.getMediaById(p.id); + if (fresh?.status === 'ready' && fresh.path !== p.path) { + imageUpdateNeeded = true; + return { ...p, name: fresh.name, path: fresh.path }; + } + return p; }) ) diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index 623bc0c68f..941e27a8d4 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -224,6 +224,8 @@ model Media { thumbnail String? alt String? thumbnailTimestamp Int? + status String @default("ready") + processingError String? organization Organization @relation(fields: [organizationId], references: [id]) agencies SocialMediaAgency[] userPicture User[] diff --git a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts index e01438aad9..e26d10079d 100644 --- a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts +++ b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts @@ -1,4 +1,5 @@ -import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'; +import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'; +import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; import 'multer'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import mime from 'mime-types'; @@ -154,6 +155,26 @@ class CloudflareStorage implements IUploadProvider { } } + async signDownloadUrl(fileName: string) { + return getSignedUrl( + this._client, + new GetObjectCommand({ Bucket: this._bucketName, Key: fileName }), + { expiresIn: 3 * 3600 } + ); + } + + async signUploadUrl(fileName: string, contentType: string) { + return getSignedUrl( + this._client, + new PutObjectCommand({ + Bucket: this._bucketName, + Key: fileName, + ContentType: contentType, + }), + { expiresIn: 3 * 3600 } + ); + } + // Implement the removeFile method from IUploadProvider async removeFile(filePath: string): Promise { // const fileName = filePath.split('/').pop(); // Extract the filename from the path diff --git a/libraries/nestjs-libraries/src/upload/media.processor.interface.ts b/libraries/nestjs-libraries/src/upload/media.processor.interface.ts new file mode 100644 index 0000000000..1d705b600f --- /dev/null +++ b/libraries/nestjs-libraries/src/upload/media.processor.interface.ts @@ -0,0 +1,69 @@ +// Contract of the media normalization service (postiz-uploader schema/v1). +// The service knows nothing about Postiz: URLs in, metadata out. +export interface MediaProcessorJob { + version: 1; + type: 'video' | 'image'; + reference: string; + source: { url: string; content_type?: string }; + output: { url: string; content_type: string }; + thumbnail?: { + url: string; + timestamp_seconds?: number; + content_type?: 'image/jpeg'; + }; + rules: { + short_side_min: number; + short_side_max: number; + long_side_max: number; + video?: { + container?: 'mp4'; + video_codec?: 'h264'; + profile?: string; + pixel_format?: string; + fps_max?: number; + quality?: number; + audio_codec?: string; + audio_bitrate_kbps?: number; + audio_sample_rate?: number; + faststart?: boolean; + }; + image?: { jpeg_quality?: number; keep_format?: boolean }; + }; + limits?: { + max_input_bytes?: number; + max_duration_seconds?: number; + timeout_seconds?: number; + }; +} + +export interface MediaProcessorResult { + version: 1; + reference: string; + status: 'completed' | 'unchanged' | 'failed'; + actions: string[]; + output?: { + width: number; + height: number; + duration_seconds?: number; + bytes: number; + content_type: string; + }; + thumbnail?: { width: number; height: number; bytes: number } | null; + failure?: { + code: string; + message: string; + retryable: boolean; + stderr_tail?: string; + } | null; +} + +export type MediaProcessorStatus = + | { status: 'pending' } + | { status: 'completed'; result: MediaProcessorResult } + // the queue itself failed (crash, expired job); retryable by the caller + | { status: 'failed'; error: string }; + +export interface IMediaProcessor { + submit(job: MediaProcessorJob): Promise; + status(jobId: string): Promise; +} diff --git a/libraries/nestjs-libraries/src/upload/r2.uploader.ts b/libraries/nestjs-libraries/src/upload/r2.uploader.ts index ef2ed4fb5b..3164d5ed81 100644 --- a/libraries/nestjs-libraries/src/upload/r2.uploader.ts +++ b/libraries/nestjs-libraries/src/upload/r2.uploader.ts @@ -14,6 +14,7 @@ import { Request, Response } from 'express'; import crypto from 'crypto'; import path from 'path'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; // eslint-disable-next-line @typescript-eslint/no-var-requires const { fileTypeFromBuffer } = require('file-type'); @@ -30,9 +31,18 @@ const ALLOWED_EXT_TO_MIME: Record = { '.mp4': 'video/mp4', }; +// Multipart uploads go through the normalizer, so they may also carry +// QuickTime, which it turns into an mp4; simple uploads never do +function multipartExtToMime(): Record { + return { + ...ALLOWED_EXT_TO_MIME, + ...(UploadFactory.processorEnabled() ? { '.mov': 'video/quicktime' } : {}), + }; +} + function normalizeExtension(filename: string): string | null { const ext = path.extname(filename || '').toLowerCase(); - return ALLOWED_EXT_TO_MIME[ext] ? ext : null; + return multipartExtToMime()[ext] ? ext : null; } const { @@ -111,7 +121,7 @@ export async function createMultipartUpload(req: Request, res: Response) { if (!safeExt) { return res.status(400).json({ message: 'Unsupported file type.' }); } - const safeContentType = ALLOWED_EXT_TO_MIME[safeExt]; + const safeContentType = multipartExtToMime()[safeExt]; const randomFilename = generateRandomString() + safeExt; try { @@ -205,7 +215,7 @@ export async function completeMultipartUpload(req: Request, res: Response) { ); return res.status(400).json({ message: 'Unsupported file type.' }); } - const expectedMime = ALLOWED_EXT_TO_MIME[safeExt]; + const expectedMime = multipartExtToMime()[safeExt]; const head = await R2.send( new GetObjectCommand({ @@ -222,7 +232,10 @@ export async function completeMultipartUpload(req: Request, res: Response) { const prefix = Buffer.concat(chunks); const detected = await fileTypeFromBuffer(prefix); - if (!detected || detected.mime !== expectedMime) { + // a .mov with an ISO brand sniffs as video/mp4; the normalizer reads both + const acceptedMimes = + safeExt === '.mov' ? ['video/quicktime', 'video/mp4'] : [expectedMime]; + if (!detected || !acceptedMimes.includes(detected.mime)) { await R2.send( new DeleteObjectCommand({ Bucket: CLOUDFLARE_BUCKETNAME, Key: key }) ); diff --git a/libraries/nestjs-libraries/src/upload/runpod.media.processor.ts b/libraries/nestjs-libraries/src/upload/runpod.media.processor.ts new file mode 100644 index 0000000000..2366957726 --- /dev/null +++ b/libraries/nestjs-libraries/src/upload/runpod.media.processor.ts @@ -0,0 +1,66 @@ +import { + IMediaProcessor, + MediaProcessorJob, + MediaProcessorStatus, +} from './media.processor.interface'; + +// RunPod Serverless wraps every request as { input } and every result as +// { id, status, output }. The worker returns failures as a normal result with +// status "failed" inside, so a RunPod-level FAILED is only an unhandled crash. +export class RunPodMediaProcessor implements IMediaProcessor { + private _baseUrl: string; + + constructor(private _apiKey: string, endpointId: string) { + this._baseUrl = `https://api.runpod.ai/v2/${endpointId}`; + } + + private async request(path: string, init?: RequestInit) { + const response = await fetch(`${this._baseUrl}${path}`, { + ...init, + headers: { + Authorization: `Bearer ${this._apiKey}`, + 'Content-Type': 'application/json', + ...(init?.headers || {}), + }, + signal: AbortSignal.timeout(30000), + }); + + if (!response.ok) { + throw new Error( + `RunPod ${response.status}: ${(await response.text()).slice(0, 500)}` + ); + } + + return response.json(); + } + + async submit(job: MediaProcessorJob): Promise { + const { id } = await this.request('/run', { + method: 'POST', + body: JSON.stringify({ input: job }), + }); + + if (!id) { + throw new Error('RunPod accepted the job without returning an id'); + } + + return id; + } + + async status(jobId: string): Promise { + const { status, output, error } = await this.request(`/status/${jobId}`, { + method: 'GET', + }); + + switch (status) { + case 'COMPLETED': + return { status: 'completed', result: output }; + case 'FAILED': + case 'CANCELLED': + case 'TIMED_OUT': + return { status: 'failed', error: error || status }; + default: + return { status: 'pending' }; + } + } +} diff --git a/libraries/nestjs-libraries/src/upload/upload.factory.ts b/libraries/nestjs-libraries/src/upload/upload.factory.ts index f89d310a8c..a66332110f 100644 --- a/libraries/nestjs-libraries/src/upload/upload.factory.ts +++ b/libraries/nestjs-libraries/src/upload/upload.factory.ts @@ -1,6 +1,8 @@ import { CloudflareStorage } from './cloudflare.storage'; import { IUploadProvider } from './upload.interface'; import { LocalStorage } from './local.storage'; +import { IMediaProcessor } from './media.processor.interface'; +import { RunPodMediaProcessor } from './runpod.media.processor'; export class UploadFactory { static createStorage(): IUploadProvider { @@ -22,4 +24,24 @@ export class UploadFactory { throw new Error(`Invalid storage type ${storageProvider}`); } } + + // Normalization needs presigned URLs, so it is only available on cloud storage + static processorEnabled() { + return ( + process.env.STORAGE_PROVIDER === 'cloudflare' && + !!process.env.RUNPOD_API_KEY && + !!process.env.RUNPOD_ENDPOINT_ID + ); + } + + static createProcessor(): IMediaProcessor | null { + if (!UploadFactory.processorEnabled()) { + return null; + } + + return new RunPodMediaProcessor( + process.env.RUNPOD_API_KEY!, + process.env.RUNPOD_ENDPOINT_ID! + ); + } } diff --git a/libraries/nestjs-libraries/src/upload/upload.interface.ts b/libraries/nestjs-libraries/src/upload/upload.interface.ts index 52c2f030f5..73230f1107 100644 --- a/libraries/nestjs-libraries/src/upload/upload.interface.ts +++ b/libraries/nestjs-libraries/src/upload/upload.interface.ts @@ -2,4 +2,8 @@ export interface IUploadProvider { uploadSimple(path: string): Promise; uploadFile(file: Express.Multer.File): Promise; removeFile(filePath: string): Promise; + // Presigned URLs handed to the media processor, which has no storage + // credentials; only cloud storage can mint them + signDownloadUrl?(fileName: string): Promise; + signUploadUrl?(fileName: string, contentType: string): Promise; } diff --git a/libraries/react-shared-libraries/src/helpers/uppy.upload.ts b/libraries/react-shared-libraries/src/helpers/uppy.upload.ts index 12af1cd579..acece4e7d7 100644 --- a/libraries/react-shared-libraries/src/helpers/uppy.upload.ts +++ b/libraries/react-shared-libraries/src/helpers/uppy.upload.ts @@ -2,6 +2,110 @@ import XHRUpload from '@uppy/xhr-upload'; import AwsS3Multipart from '@uppy/aws-s3'; import sha256 from 'sha256'; import Transloadit from '@uppy/transloadit'; +import { BasePlugin } from '@uppy/core'; + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +// Keeps a file in the "processing" state after it reached the bucket until the +// media normalization workflow marks the record ready, the same way +// Transloadit's waitForEncoding holds the dashboard until the assembly is done. +// Files whose record is already ready (no normalizer, gif, ...) pass through. +// The bytes are already stored, so giving up never fails the upload: the +// original file is used instead. +export class WaitForMediaProcessing extends BasePlugin { + constructor( + uppy: any, + opts: { + fetch: any; + processingMessage: string; + fallbackMessage: string; + interval?: number; + maxWait?: number; + } + ) { + super(uppy, opts); + this.id = 'WaitForMediaProcessing'; + this.type = 'modifier'; + } + + install() { + this.uppy.addPostProcessor(this.process); + } + + uninstall() { + this.uppy.removePostProcessor(this.process); + } + + process = async (fileIDs: string[]) => { + await Promise.all(fileIDs.map((id) => this.waitForFile(id))); + }; + + waitForFile = async (id: string) => { + const file: any = this.uppy.getFile(id); + const saved = file?.response?.body?.saved; + if (saved?.status !== 'processing') { + return; + } + + this.uppy.emit('postprocess-progress', file, { + mode: 'indeterminate', + message: this.opts.processingMessage, + }); + + const interval = this.opts.interval || 2000; + const deadline = Date.now() + (this.opts.maxWait || 20 * 60 * 1000); + let failures = 0; + let media: any = saved; + // the file disappears when the user cancels, so stop polling with it + while (this.uppy.getFile(id) && Date.now() < deadline && failures < 5) { + await sleep(interval); + + try { + const response = await ( + await this.opts.fetch(`/media/${saved.id}/status`) + ).json(); + // a 4xx body has no status; treat it like a failed poll + if (!response?.status) { + throw new Error(response?.message || 'Media not found'); + } + media = response; + failures = 0; + } catch (err) { + failures++; + continue; + } + + if (media.status !== 'processing') { + break; + } + } + + const current: any = this.uppy.getFile(id); + if (!current) { + return; + } + + if (media.status !== 'ready') { + // a file that only existed to be converted has nothing to fall back to + const usable = /\.(png|jpe?g|gif|webp|mp4)$/i.test(media.name || ''); + if (!usable) { + this.uppy.info(media.processingError || this.opts.fallbackMessage, 'error', 5000); + this.uppy.setFileState(id, { error: media.processingError || 'failed' } as any); + this.uppy.emit('postprocess-complete', this.uppy.getFile(id)); + return; + } + this.uppy.info(this.opts.fallbackMessage, 'warning', 5000); + } + + this.uppy.setFileState(id, { + response: { + ...current.response, + body: { ...current.response.body, saved: media }, + }, + } as any); + this.uppy.emit('postprocess-complete', this.uppy.getFile(id)); + }; +} const fetchUploadApiEndpoint = async ( fetch: any, endpoint: string, diff --git a/libraries/react-shared-libraries/src/helpers/variable.context.tsx b/libraries/react-shared-libraries/src/helpers/variable.context.tsx index 67e3b40078..4bf3870dfe 100644 --- a/libraries/react-shared-libraries/src/helpers/variable.context.tsx +++ b/libraries/react-shared-libraries/src/helpers/variable.context.tsx @@ -29,6 +29,7 @@ interface VariableContextInterface { language: string; dub: boolean; transloadit: string[]; + mediaProcessing: boolean; sentryDsn: string; extensionId: string; googleAdsId?: string; @@ -63,6 +64,7 @@ const VariableContext = createContext({ language: '', dub: false, transloadit: [], + mediaProcessing: false, sentryDsn: '', extensionId: '', } as VariableContextInterface); From 914b29f00163afe701354e43e07b4482ce013781 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 16 Sep 2026 16:49:36 +0700 Subject: [PATCH 33/61] feat: replace --- .../database/prisma/media/media.service.ts | 17 +++++++++--- .../src/upload/cloudflare.storage.ts | 26 +++++++++++++------ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts index 307f70c644..1d31067345 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts @@ -170,11 +170,12 @@ export class MediaService { return media; } - // The normalized file sits next to the original under a derived key, so the - // polling side needs nothing but the media record to know where it landed + // The normalized file overwrites the original in place; only a container + // change (mov -> mp4, jpeg -> jpg) lands under a new key. Either way the + // polling side needs nothing but the media record to know where it is private normalizedName(name: string) { const ext = extname(name).toLowerCase(); - return `${name.slice(0, -ext.length)}-n.${PROCESSABLE[ext].ext}`; + return `${name.slice(0, -ext.length)}.${PROCESSABLE[ext].ext}`; } // Returns the processor job id; when this process has nothing to run the @@ -278,6 +279,16 @@ export class MediaService { path: media.path.slice(0, media.path.lastIndexOf('/') + 1) + outputName, fileSize: result.output?.bytes, }); + + // a same-key output already replaced the original; a stray object after a + // container change is harmless, so a failed delete never fails the media + if (outputName !== media.name) { + try { + await this.storage.removeFile(media.name); + } catch (err) { + console.error(`Could not remove original media ${media.name}:`, err); + } + } return true; } diff --git a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts index e26d10079d..748807f9af 100644 --- a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts +++ b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts @@ -1,4 +1,9 @@ -import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'; +import { + S3Client, + PutObjectCommand, + GetObjectCommand, + DeleteObjectCommand, +} from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; import 'multer'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; @@ -175,14 +180,19 @@ class CloudflareStorage implements IUploadProvider { ); } - // Implement the removeFile method from IUploadProvider + // Accepts either the public URL or the bare key async removeFile(filePath: string): Promise { - // const fileName = filePath.split('/').pop(); // Extract the filename from the path - // const command = new DeleteObjectCommand({ - // Bucket: this._bucketName, - // Key: fileName, - // }); - // await this._client.send(command); + const fileName = filePath.split('/').pop(); + if (!fileName) { + return; + } + + await this._client.send( + new DeleteObjectCommand({ + Bucket: this._bucketName, + Key: fileName, + }) + ); } } From b3cace23aff3e75f12c8c5bc1921f54529275dcf Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 16 Sep 2026 17:15:52 +0700 Subject: [PATCH 34/61] fix: runpod --- apps/backend/src/api/routes/media.controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/api/routes/media.controller.ts b/apps/backend/src/api/routes/media.controller.ts index f942c10f3a..dabc629d79 100644 --- a/apps/backend/src/api/routes/media.controller.ts +++ b/apps/backend/src/api/routes/media.controller.ts @@ -159,7 +159,8 @@ export class MediaController { @Param('endpoint') endpoint: string ) { const upload = await handleR2Upload(endpoint, req, res); - if (endpoint !== 'complete-multipart-upload') { + // a rejected or failed completion has already answered with its own status + if (endpoint !== 'complete-multipart-upload' || res.headersSent) { return upload; } From 07fd99efbb5d5e52c40f8d5403b0a0b1ba8e974b Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Wed, 16 Sep 2026 15:13:48 +0200 Subject: [PATCH 35/61] ci: regenerate the lockfile instead of merging it in staging conflicts --- .github/workflows/staging-conflicts.yml | 63 +++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/.github/workflows/staging-conflicts.yml b/.github/workflows/staging-conflicts.yml index 6f44cd2e10..118a26f276 100644 --- a/.github/workflows/staging-conflicts.yml +++ b/.github/workflows/staging-conflicts.yml @@ -90,6 +90,23 @@ jobs: xargs -0 git checkout --theirs -- < /tmp/ci_paths xargs -0 git add -- < /tmp/ci_paths + # The lockfile is generated, never hand-merged: a textual merge of it can + # look clean and still be broken (a dropped entry fails `pnpm install` + # with ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY). Main's copy is staged here + # only to clear the conflict; it is rewritten from scratch further down, + # once package.json is final. + - name: Defer the lockfile + if: steps.probe.outputs.conflicted == 'true' + run: | + if ! git diff --name-only --diff-filter=U -- pnpm-lock.yaml | grep -q .; then + echo "pnpm-lock.yaml is not conflicted" + exit 0 + fi + + echo "taking main's lockfile as a placeholder, to be regenerated" + git checkout --theirs -- pnpm-lock.yaml + git add -- pnpm-lock.yaml + - name: Resolve with Claude if: steps.probe.outputs.conflicted == 'true' uses: anthropics/claude-code-action@v1 @@ -114,12 +131,51 @@ jobs: - Never modify anything under `.github/`. Conflicts there are already resolved and staged for you; leave them exactly as they are and resolve only the remaining paths. + - Never modify `pnpm-lock.yaml`. It is generated, it is already + staged for you, and it is regenerated from `package.json` after + you finish. Resolve `package.json` itself normally. - If a conflict is ambiguous enough that you would be guessing at the correct resolution, stop without committing and explain why. claude_args: | --model claude-sonnet-5 --allowedTools "Read,Glob,Grep,Edit,Write,Bash(git status:*),Bash(git diff:*),Bash(git log:*),Bash(git show:*),Bash(git ls-files:*),Bash(git add:*),Bash(git commit:*)" + - name: Set up Node + if: steps.probe.outputs.conflicted == 'true' + uses: actions/setup-node@v4 + with: + node-version: 22.12.0 + + - name: Install pnpm + if: steps.probe.outputs.conflicted == 'true' + uses: pnpm/action-setup@v4 + with: + version: 10 + run_install: false + + # Rewrites the lockfile from the merged package.json and folds it into the + # merge commit, so the resolution never carries a hand-merged lockfile. + - name: Rewrite the lockfile + if: steps.probe.outputs.conflicted == 'true' + run: | + # If Claude bailed out, the merge is still open. Amending here would + # rewrite staging's tip instead, so leave it for Verify to fail on. + if git rev-parse -q --verify MERGE_HEAD >/dev/null || git ls-files -u | grep -q .; then + echo "merge was not committed, skipping the rewrite" + exit 0 + fi + + pnpm install --lockfile-only --no-frozen-lockfile --ignore-scripts + + if git diff --quiet -- pnpm-lock.yaml; then + echo "regenerated lockfile matches the committed one" + exit 0 + fi + + git add -- pnpm-lock.yaml + git commit --amend --no-edit + echo "lockfile regenerated and folded into the merge commit" + - name: Verify resolution if: steps.probe.outputs.conflicted == 'true' run: | @@ -161,6 +217,13 @@ jobs: fi done + # The failure this guards against is a lockfile that merges cleanly + # but no longer resolves, which only surfaces on the next install. + if ! pnpm install --frozen-lockfile --ignore-scripts; then + echo "::error::pnpm-lock.yaml does not install, refusing to push" + exit 1 + fi + echo "Resolution commit:" git log -1 --stat From 118d89c0fb3c3396d31dbc3646ea3126aca924ea Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 16 Sep 2026 22:46:11 +0700 Subject: [PATCH 36/61] feat: fix uploading --- .../src/api/routes/media.controller.ts | 35 +++--- .../v1/public.integrations.controller.ts | 96 ++------------ .../src/chat/tools/upload.from.url.tool.ts | 102 +++------------ .../database/prisma/media/media.service.ts | 107 ++++++++++++++-- .../src/upload/cloudflare.storage.ts | 42 ++++++- .../src/upload/custom.upload.validation.ts | 119 +++++++++++------- .../src/upload/local.storage.ts | 113 ++++++++++------- .../src/upload/multer.stream.engine.ts | 67 ++++++++++ .../src/upload/upload.interface.ts | 17 +++ .../src/upload/upload.module.ts | 5 +- package.json | 1 + pnpm-lock.yaml | 52 ++++++-- 12 files changed, 454 insertions(+), 302 deletions(-) create mode 100644 libraries/nestjs-libraries/src/upload/multer.stream.engine.ts diff --git a/apps/backend/src/api/routes/media.controller.ts b/apps/backend/src/api/routes/media.controller.ts index dabc629d79..3c6902e881 100644 --- a/apps/backend/src/api/routes/media.controller.ts +++ b/apps/backend/src/api/routes/media.controller.ts @@ -1,4 +1,5 @@ import { + BadRequestException, Body, Controller, Delete, @@ -10,7 +11,6 @@ import { Res, UploadedFile, UseInterceptors, - UsePipes, } from '@nestjs/common'; import { Request, Response } from 'express'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; @@ -19,7 +19,7 @@ import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/me import { ApiTags } from '@nestjs/swagger'; import handleR2Upload from '@gitroom/nestjs-libraries/upload/r2.uploader'; import { FileInterceptor } from '@nestjs/platform-express'; -import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; +import { streamUploadOptions } from '@gitroom/nestjs-libraries/upload/multer.stream.engine'; import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; import { SaveMediaInformationDto } from '@gitroom/nestjs-libraries/dtos/media/save.media.information.dto'; @@ -85,19 +85,19 @@ export class MediaController { } @Post('/upload-server') - @UseInterceptors(FileInterceptor('file')) - @UsePipes(new CustomFileValidationPipe()) + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) async uploadServer( @GetOrgFromRequest() org: Organization, @UploadedFile() file: Express.Multer.File ) { - const originalName = file?.originalname || ''; - const uploadedFile = await this.storage.uploadFile(file); + if (!file) { + throw new BadRequestException('No file provided'); + } return this._mediaService.saveFile( org.id, - uploadedFile.originalname, - uploadedFile.path, - originalName + file.filename, + file.path, + file.originalname ); } @@ -128,26 +128,25 @@ export class MediaController { } @Post('/upload-simple') - @UseInterceptors(FileInterceptor('file')) - @UsePipes(new CustomFileValidationPipe()) + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) async uploadSimple( @GetOrgFromRequest() org: Organization, @UploadedFile('file') file: Express.Multer.File, @Body('preventSave') preventSave: string = 'false' ) { - const originalName = file.originalname; - const getFile = await this.storage.uploadFile(file); + if (!file) { + throw new BadRequestException('No file provided'); + } if (preventSave === 'true') { - const { path } = getFile; - return { path }; + return { path: file.path }; } return this._mediaService.saveFile( org.id, - getFile.originalname, - getFile.path, - originalName + file.filename, + file.path, + file.originalname ); } diff --git a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts index a2371240b2..8d1e0aa954 100644 --- a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts +++ b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts @@ -1,4 +1,5 @@ import { + BadRequestException, Body, Controller, Delete, @@ -11,12 +12,8 @@ import { UploadedFile, UseGuards, UseInterceptors, - UsePipes, } from '@nestjs/common'; -import { - CustomFileValidationPipe, - getMaxSize, -} from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; +import { streamUploadOptions } from '@gitroom/nestjs-libraries/upload/multer.stream.engine'; import { ApiTags } from '@nestjs/swagger'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { Organization } from '@prisma/client'; @@ -24,7 +21,6 @@ import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/in import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; import { PostsService } from '@gitroom/nestjs-libraries/database/prisma/posts/posts.service'; import { FileInterceptor } from '@nestjs/platform-express'; -import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto'; import { ChangePostStatusDto } from '@gitroom/nestjs-libraries/dtos/posts/change.post.status.dto'; @@ -38,21 +34,6 @@ import { VideoFunctionDto } from '@gitroom/nestjs-libraries/dtos/videos/video.fu import { UploadDto } from '@gitroom/nestjs-libraries/dtos/media/upload.dto'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; import { GetNotificationsDto } from '@gitroom/nestjs-libraries/dtos/notifications/get.notifications.dto'; -import { Readable } from 'stream'; -import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { fileTypeFromBuffer } = require('file-type'); - -const PUBLIC_API_ALLOWED_MIME = new Set([ - 'image/jpeg', - 'image/png', - 'image/gif', - 'image/webp', - 'image/avif', - 'image/bmp', - 'image/tiff', - 'video/mp4', -]); import * as Sentry from '@sentry/nestjs'; import { socialIntegrationList, @@ -70,8 +51,6 @@ import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; @ApiTags('Public API') @Controller('/public/v1') export class PublicIntegrationsController { - private storage = UploadFactory.createStorage(); - constructor( private _integrationService: IntegrationService, private _postsService: PostsService, @@ -83,8 +62,7 @@ export class PublicIntegrationsController { ) {} @Post('/upload') - @UseInterceptors(FileInterceptor('file')) - @UsePipes(new CustomFileValidationPipe()) + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) async uploadSimple( @GetOrgFromRequest() org: Organization, @UploadedFile('file') file: Express.Multer.File @@ -94,12 +72,7 @@ export class PublicIntegrationsController { throw new HttpException({ msg: 'No file provided' }, 400); } - const getFile = await this.storage.uploadFile(file); - return this._mediaService.saveFile( - org.id, - getFile.originalname, - getFile.path - ); + return this._mediaService.saveFile(org.id, file.filename, file.path); } @Post('/upload-from-url') @@ -108,62 +81,15 @@ export class PublicIntegrationsController { @Body() body: UploadDto ) { Sentry.metrics.count('public_api-request', 1); - let response: globalThis.Response; try { - response = await fetch(body.url, { - // @ts-ignore — undici option, not in lib.dom fetch types - dispatcher: ssrfSafeDispatcher, - }); - } catch { - // Network-level failure (DNS, connection refused, SSRF block, etc.) — - // fetch rejects rather than returning a non-ok response. - throw new HttpException({ msg: 'Failed to fetch URL' }, 400); - } - if (!response.ok) { - throw new HttpException({ msg: 'Failed to fetch URL' }, 400); - } - - // Guard against OOM: bail out before buffering the whole body into memory. - // Content-Length may be absent or wrong, so we re-check the real size after - // download too. The type isn't known yet (sniffed below), so the pre-check - // uses the largest allowed cap (video). - const maxDownloadSize = getMaxSize('video/mp4'); - const declaredSize = Number(response.headers.get('content-length')); - if (declaredSize && declaredSize > maxDownloadSize) { - throw new HttpException({ msg: 'File is too large.' }, 400); - } - - const buffer = Buffer.from(await response.arrayBuffer()); - const detected = await fileTypeFromBuffer(buffer); - if (!detected || !PUBLIC_API_ALLOWED_MIME.has(detected.mime)) { - throw new HttpException({ msg: 'Unsupported file type.' }, 400); - } - - if (buffer.length > getMaxSize(detected.mime)) { - throw new HttpException({ msg: 'File is too large.' }, 400); + return await this._mediaService.uploadFromUrl(org.id, body.url); + } catch (err) { + // Validation failures keep this route's { msg } error shape + if (err instanceof BadRequestException) { + throw new HttpException({ msg: err.message }, 400); + } + throw err; } - - const mimetype = detected.mime; - const ext = detected.ext; - - const getFile = await this.storage.uploadFile({ - buffer, - mimetype, - size: buffer.length, - path: '', - fieldname: '', - destination: '', - stream: new Readable(), - filename: '', - originalname: `upload.${ext}`, - encoding: '', - }); - - return this._mediaService.saveFile( - org.id, - getFile.originalname, - getFile.path - ); } @Get('/find-slot/:id') diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts index 3d99c365e3..7b7fb4dbb1 100644 --- a/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts +++ b/libraries/nestjs-libraries/src/chat/tools/upload.from.url.tool.ts @@ -3,30 +3,10 @@ import { createTool } from '@mastra/core/tools'; import { z } from 'zod'; import { Injectable } from '@nestjs/common'; import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; -import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; -import { getMaxSize } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; -import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; -import { Readable } from 'stream'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { fileTypeFromBuffer } = require('file-type'); - -// Same allow-list as the public API /upload-from-url route. -const ALLOWED_MIME = new Set([ - 'image/jpeg', - 'image/png', - 'image/gif', - 'image/webp', - 'image/avif', - 'image/bmp', - 'image/tiff', - 'video/mp4', -]); @Injectable() export class UploadFromUrlTool implements AgentToolInterface { - private storage = UploadFactory.createStorage(); - constructor(private _mediaService: MediaService) {} name = 'uploadFromUrlTool'; @@ -68,75 +48,27 @@ so the attachment passes the upload-domain validation. Returns the hosted media (context?.requestContext as any)?.get('organization') as string ); - const response = await fetch(inputData.url, { - // @ts-ignore — undici option, not in lib.dom fetch types - dispatcher: ssrfSafeDispatcher, - }); - - if (!response.ok) { - return { error: 'Failed to fetch URL' }; - } - - // Guard against OOM: bail out before buffering the whole body into - // memory. Content-Length may be absent or wrong, so we re-check the - // real size after download too. The type isn't known yet (sniffed - // below), so the pre-check uses the largest allowed cap (video). - const maxDownloadSize = getMaxSize('video/mp4'); - const declaredSize = Number(response.headers.get('content-length')); - if (declaredSize && declaredSize > maxDownloadSize) { - return { - error: `File is too large: ${declaredSize} bytes (max ${maxDownloadSize} bytes).`, - }; - } - - const buffer = Buffer.from(await response.arrayBuffer()); - const detected = await fileTypeFromBuffer(buffer); - if (!detected || !ALLOWED_MIME.has(detected.mime)) { - return { error: 'Unsupported file type.' }; - } - - const maxSize = getMaxSize(detected.mime); - if (buffer.length > maxSize) { - return { - error: `File is too large: ${buffer.length} bytes (max ${maxSize} bytes).`, - }; - } - - const getFile = await this.storage.uploadFile({ - buffer, - mimetype: detected.mime, - size: buffer.length, - path: '', - fieldname: '', - destination: '', - stream: new Readable(), - filename: '', - originalname: `upload.${detected.ext}`, - encoding: '', - }); - - return await this._mediaService.saveFile( - org.id, - getFile.originalname, - getFile.path - ); + return await this._mediaService.uploadFromUrl(org.id, inputData.url); } catch (err) { // undici's fetch rejects with a generic TypeError('fetch failed') // and hides the real reason (DNS, TLS, SSRF block, ...) in - // err.cause, so surface it for the agent. Error.cause isn't in the - // es2020 lib typings this repo compiles against, hence the cast. - const cause = - err instanceof Error - ? (err as Error & { cause?: unknown }).cause - : undefined; - const causeText = - cause instanceof Error && cause.message - ? ` (${cause.message})` - : ''; + // err.cause, which the service wraps once more, so walk the chain + // and surface it for the agent. Error.cause isn't in the es2020 + // lib typings this repo compiles against, hence the cast + const message = + err instanceof Error ? err.message : 'Unexpected error'; + const causes: string[] = []; + let cause = (err as Error & { cause?: unknown })?.cause; + while (cause instanceof Error) { + if (cause.message) { + causes.push(cause.message); + } + cause = (cause as Error & { cause?: unknown }).cause; + } + const causeText = causes.length ? ` (${causes.join(': ')})` : ''; + return { - error: `Failed to upload media from URL: ${ - err instanceof Error ? err.message : 'Unexpected error' - }${causeText}`, + error: `Failed to upload media from URL: ${message}${causeText}`, }; } }, diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts index 1d31067345..11d222c525 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts @@ -1,4 +1,4 @@ -import { HttpException, Injectable } from '@nestjs/common'; +import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; import { MediaRepository } from '@gitroom/nestjs-libraries/database/prisma/media/media.repository'; import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service'; import { generationError } from '@gitroom/nestjs-libraries/openai/generation.error'; @@ -19,6 +19,11 @@ import { organizationId } from '@gitroom/nestjs-libraries/temporal/temporal.sear import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { MediaProcessorJob } from '@gitroom/nestjs-libraries/upload/media.processor.interface'; import { extname } from 'path'; +import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; +import { + getMaxSize, + uploadStreamToStorage, +} from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; // What every upload is normalized to before a provider ever sees it. The // service applies exactly these, so a platform-specific need belongs in the @@ -53,7 +58,10 @@ const LIMITS: MediaProcessorJob['limits'] = { }; // Extension of the normalized file and the content type the presigned PUT is // minted for; anything else (gif, avif, ...) is stored as uploaded -const PROCESSABLE: Record = { +const PROCESSABLE: Record< + string, + { type: 'video' | 'image'; ext: string; contentType: string } +> = { '.mp4': { type: 'video', ext: 'mp4', contentType: 'video/mp4' }, '.mov': { type: 'video', ext: 'mp4', contentType: 'video/mp4' }, '.jpg': { type: 'image', ext: 'jpg', contentType: 'image/jpeg' }, @@ -62,7 +70,14 @@ const PROCESSABLE: Record getMaxSize('video/mp4')) { + await response.body.cancel(); + throw new BadRequestException('File is too large.'); + } + + const uploaded = await uploadStreamToStorage( + this.storage, + response.body, + declaredSize + ); + return this.saveFile(org, uploaded.originalname, uploaded.path); + } + + saveFile( + org: string, + fileName: string, + filePath: string, + originalName?: string + ) { + return this._mediaRepository.saveFile( + org, + fileName, + filePath, + originalName + ); } // Saves an upload and, when a normalizer is configured, hands it to the @@ -123,7 +185,11 @@ export class MediaService { ) { const media = await this.saveFile(org, fileName, filePath, originalName); const client = this._temporalService.client.getRawClient(); - if (!this.processor || !PROCESSABLE[extname(fileName).toLowerCase()] || !client) { + if ( + !this.processor || + !PROCESSABLE[extname(fileName).toLowerCase()] || + !client + ) { return media; } @@ -205,7 +271,10 @@ export class MediaService { reference: media.id, source: { url: await this.storage.signDownloadUrl(media.name) }, output: { - url: await this.storage.signUploadUrl(outputName, processable.contentType), + url: await this.storage.signUploadUrl( + outputName, + processable.contentType + ), content_type: processable.contentType, }, rules: processable.type === 'video' ? VIDEO_RULES : IMAGE_RULES, @@ -247,9 +316,15 @@ export class MediaService { } const { result } = job; - if (!result || !['completed', 'unchanged', 'failed'].includes(result.status)) { + if ( + !result || + !['completed', 'unchanged', 'failed'].includes(result.status) + ) { await this._mediaRepository.finishProcessing(org, mediaId, { - error: `Unexpected processor result: ${JSON.stringify(result).slice(0, 500)}`, + error: `Unexpected processor result: ${JSON.stringify(result).slice( + 0, + 500 + )}`, }); return true; } @@ -258,7 +333,9 @@ export class MediaService { // the stderr tail is the only way to know what ffmpeg objected to await this._mediaRepository.finishProcessing(org, mediaId, { error: [ - `${result.failure?.code || 'FAILED'}: ${result.failure?.message || ''}`, + `${result.failure?.code || 'FAILED'}: ${ + result.failure?.message || '' + }`, result.failure?.stderr_tail, ] .filter(Boolean) @@ -298,9 +375,13 @@ export class MediaService { return; } - return this._mediaRepository.finishProcessing(media.organizationId, mediaId, { - error, - }); + return this._mediaRepository.finishProcessing( + media.organizationId, + mediaId, + { + error, + } + ); } getMedia(org: string, page: number, search?: string) { diff --git a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts index 748807f9af..6fc597d5c7 100644 --- a/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts +++ b/libraries/nestjs-libraries/src/upload/cloudflare.storage.ts @@ -5,12 +5,14 @@ import { DeleteObjectCommand, } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +import { Upload } from '@aws-sdk/lib-storage'; +import { Readable } from 'stream'; import 'multer'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import mime from 'mime-types'; // @ts-ignore import { getExtension } from 'mime'; -import { IUploadProvider } from './upload.interface'; +import { IUploadProvider, UploadedStream } from './upload.interface'; import axios from 'axios'; import { isSafePublicHttpsUrl } from '@gitroom/nestjs-libraries/dtos/webhooks/webhook.url.validator'; import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; @@ -160,6 +162,44 @@ class CloudflareStorage implements IUploadProvider { } } + async uploadStream( + stream: Readable, + mimetype: string, + ext: string + ): Promise { + try { + if (!ALLOWED_MIME_TYPES.has(mimetype)) { + throw new Error('Unsupported file type.'); + } + const id = makeId(10); + const key = `${id}.${ext}`; + + // Multipart upload holds only a few parts in memory at a time instead + // of the whole body, and does not need to know the length up front + const upload = new Upload({ + client: this._client, + params: { + Bucket: this._bucketName, + ACL: 'public-read', + Key: key, + Body: stream, + ContentType: mimetype, + }, + }); + await upload.done(); + + return { + filename: key, + mimetype, + originalname: key, + path: `${this._uploadUrl}/${key}`, + }; + } catch (err) { + console.error('Error streaming file to Cloudflare R2:', err); + throw err; + } + } + async signDownloadUrl(fileName: string) { return getSignedUrl( this._client, diff --git a/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts b/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts index 1e3c5d1441..788473b8a1 100644 --- a/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts +++ b/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts @@ -1,12 +1,12 @@ -import { - BadRequestException, - Injectable, - PipeTransform, -} from '@nestjs/common'; +import { BadRequestException } from '@nestjs/common'; +import { pipeline, Readable, Transform } from 'stream'; +import { IUploadProvider } from './upload.interface'; // eslint-disable-next-line @typescript-eslint/no-var-requires -const { fileTypeFromBuffer } = require('file-type'); +const { fileTypeStream } = require('file-type'); -const ALLOWED_MIME_TYPES = new Set([ +// What users may put in the media library, whether by multipart upload or +// from a remote URL; narrower than what storage itself accepts, no audio +export const UPLOAD_ALLOWED_MIME = new Set([ 'image/jpeg', 'image/png', 'image/gif', @@ -17,46 +17,6 @@ const ALLOWED_MIME_TYPES = new Set([ 'video/mp4', ]); -@Injectable() -export class CustomFileValidationPipe implements PipeTransform { - async transform(value: any) { - if (!value || typeof value !== 'object') { - return value; - } - - // Skip non-file parameters (org, body, query, etc.) - if (!('buffer' in value) && !('mimetype' in value) && !('fieldname' in value)) { - return value; - } - - if (!value.buffer || !Buffer.isBuffer(value.buffer)) { - throw new BadRequestException('Invalid file upload.'); - } - - const detected = await fileTypeFromBuffer(value.buffer); - if (!detected || !ALLOWED_MIME_TYPES.has(detected.mime)) { - throw new BadRequestException('Unsupported file type.'); - } - - const maxSize = getMaxSize(detected.mime); - if (value.size > maxSize) { - throw new BadRequestException( - `File size exceeds the maximum allowed size of ${maxSize} bytes.` - ); - } - - value.mimetype = detected.mime; - const safeBase = (value.originalname || 'upload') - .replace(/\.[^./\\]*$/, '') - .replace(/[\\/]/g, '_') - .slice(0, 100) || 'upload'; - value.originalname = `${safeBase}.${detected.ext}`; - - return value; - } - -} - export function getMaxSize(mimeType: string): number { if (mimeType.startsWith('image/')) { return 10 * 1024 * 1024; // 10 MB @@ -66,3 +26,68 @@ export function getMaxSize(mimeType: string): number { throw new BadRequestException('Unsupported file type.'); } } + +// Passes bytes through and fails once they exceed maxSize, so a body with a +// missing or lying Content-Length cannot be streamed into storage unbounded +export function maxSizeStream(maxSize: number) { + let total = 0; + return new Transform({ + transform(chunk: Buffer, _encoding, callback) { + total += chunk.length; + if (total > maxSize) { + return callback(new BadRequestException('File is too large.')); + } + callback(null, chunk); + }, + }); +} + +// Sniffs the real type from the first bytes, applies the per-type size cap +// and streams the rest into storage, so only the sniffing prefix and a few +// upload parts are ever in memory. Rejections are BadRequestException with +// the same messages the old buffer validation used. `declaredSize` is the +// Content-Length when the sender gave one; it may be absent or wrong, so the +// stream cap is what really enforces the limit +export async function uploadStreamToStorage( + storage: IUploadProvider, + webStream: ReadableStream, + declaredSize = 0 +) { + let sniffed: ReadableStream & { fileType?: { mime: string; ext: string } }; + try { + sniffed = await fileTypeStream(webStream); + } catch (err) { + throw new BadRequestException('Failed to read file', { cause: err }); + } + const detected = sniffed.fileType; + if (!detected || !UPLOAD_ALLOWED_MIME.has(detected.mime)) { + await sniffed.cancel(); + throw new BadRequestException('Unsupported file type.'); + } + + const maxSize = getMaxSize(detected.mime); + if (declaredSize > maxSize) { + await sniffed.cancel(); + throw new BadRequestException('File is too large.'); + } + + // pipeline (not pipe) so failing the cap also tears down the source + const body = pipeline( + Readable.fromWeb(sniffed as any), + maxSizeStream(maxSize), + () => {} + ); + + try { + const uploaded = await storage.uploadStream( + body, + detected.mime, + detected.ext + ); + return { ...uploaded, ext: detected.ext }; + } catch (err) { + // The size cap rejects mid-upload with its own BadRequestException + body.destroy(); + throw err; + } +} diff --git a/libraries/nestjs-libraries/src/upload/local.storage.ts b/libraries/nestjs-libraries/src/upload/local.storage.ts index 3351253a02..6a4452e1fa 100644 --- a/libraries/nestjs-libraries/src/upload/local.storage.ts +++ b/libraries/nestjs-libraries/src/upload/local.storage.ts @@ -1,5 +1,7 @@ -import { IUploadProvider } from './upload.interface'; -import { mkdirSync, unlink, writeFileSync } from 'fs'; +import { IUploadProvider, UploadedStream } from './upload.interface'; +import { createWriteStream, mkdirSync, unlink, writeFileSync } from 'fs'; +import { Readable } from 'stream'; +import { pipeline } from 'stream/promises'; import { isSafePublicHttpsUrl } from '@gitroom/nestjs-libraries/dtos/webhooks/webhook.url.validator'; import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; import { parseDataUrl } from '@gitroom/nestjs-libraries/upload/data.url'; @@ -23,6 +25,30 @@ const LOCAL_STORAGE_ALLOWED_MIME = new Set([ export class LocalStorage implements IUploadProvider { constructor(private uploadDirectory: string) {} + // Files live under /YYYY/MM/DD with a random name; creates the folder + private newFilePath(ext: string) { + const now = new Date(); + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); + const day = String(now.getDate()).padStart(2, '0'); + + const innerPath = `/${year}/${month}/${day}`; + const dir = `${this.uploadDirectory}${innerPath}`; + mkdirSync(dir, { recursive: true }); + + const randomName = Array(32) + .fill(null) + .map(() => Math.round(Math.random() * 16).toString(16)) + .join(''); + + const filename = `${randomName}.${ext}`; + return { + filename, + filePath: `${dir}/${filename}`, + path: process.env.FRONTEND_URL + '/uploads' + `${innerPath}/${filename}`, + }; + } + async uploadSimple(path: string) { const dataUrl = path.startsWith('data:') ? parseDataUrl(path) : null; @@ -49,28 +75,12 @@ export class LocalStorage implements IUploadProvider { if (!detected || !LOCAL_STORAGE_ALLOWED_MIME.has(detected.mime)) { throw new Error('Unsupported file type.'); } - const findExtension = detected.ext; - - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const day = String(now.getDate()).padStart(2, '0'); - const innerPath = `/${year}/${month}/${day}`; - const dir = `${this.uploadDirectory}${innerPath}`; - mkdirSync(dir, { recursive: true }); - - const randomName = Array(32) - .fill(null) - .map(() => Math.round(Math.random() * 16).toString(16)) - .join(''); - - const filePath = `${dir}/${randomName}.${findExtension}`; - const publicPath = `${innerPath}/${randomName}.${findExtension}`; + const { filePath, path: publicUrl } = this.newFilePath(detected.ext); // Logic to save the file to the filesystem goes here writeFileSync(filePath, body); - return process.env.FRONTEND_URL + '/uploads' + publicPath; + return publicUrl; } async uploadFile(file: Express.Multer.File): Promise { @@ -79,33 +89,16 @@ export class LocalStorage implements IUploadProvider { if (!detected || !LOCAL_STORAGE_ALLOWED_MIME.has(detected.mime)) { throw new Error('Unsupported file type.'); } - const safeExt = `.${detected.ext}`; const safeMime = detected.mime; - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const day = String(now.getDate()).padStart(2, '0'); - - const innerPath = `/${year}/${month}/${day}`; - const dir = `${this.uploadDirectory}${innerPath}`; - mkdirSync(dir, { recursive: true }); - - const randomName = Array(32) - .fill(null) - .map(() => Math.round(Math.random() * 16).toString(16)) - .join(''); - - const filePath = `${dir}/${randomName}${safeExt}`; - const publicPath = `${innerPath}/${randomName}${safeExt}`; - + const { filename, filePath, path } = this.newFilePath(detected.ext); writeFileSync(filePath, file.buffer); return { - filename: `${randomName}${safeExt}`, - path: process.env.FRONTEND_URL + '/uploads' + publicPath, + filename, + path, mimetype: safeMime, - originalname: `${randomName}${safeExt}`, + originalname: filename, }; } catch (err) { console.error('Error uploading file to Local Storage:', err); @@ -113,10 +106,46 @@ export class LocalStorage implements IUploadProvider { } } + async uploadStream( + stream: Readable, + mimetype: string, + ext: string + ): Promise { + try { + if (!LOCAL_STORAGE_ALLOWED_MIME.has(mimetype)) { + throw new Error('Unsupported file type.'); + } + + const { filename, filePath, path } = this.newFilePath(ext); + try { + await pipeline(stream, createWriteStream(filePath)); + } catch (err) { + // Don't leave a truncated file behind (size cap hit, remote closed, ...) + await this.removeFile(filePath).catch(() => {}); + throw err; + } + + return { + filename, + path, + mimetype, + originalname: filename, + }; + } catch (err) { + console.error('Error streaming file to Local Storage:', err); + throw err; + } + } + + // Accepts either the public URL or the filesystem path async removeFile(filePath: string): Promise { + const publicPrefix = process.env.FRONTEND_URL + '/uploads'; + const localPath = filePath.startsWith(publicPrefix) + ? this.uploadDirectory + filePath.slice(publicPrefix.length) + : filePath; // Logic to remove the file from the filesystem goes here return new Promise((resolve, reject) => { - unlink(filePath, (err) => { + unlink(localPath, (err) => { if (err) { reject(err); } else { diff --git a/libraries/nestjs-libraries/src/upload/multer.stream.engine.ts b/libraries/nestjs-libraries/src/upload/multer.stream.engine.ts new file mode 100644 index 0000000000..2d5d205a06 --- /dev/null +++ b/libraries/nestjs-libraries/src/upload/multer.stream.engine.ts @@ -0,0 +1,67 @@ +import { Request } from 'express'; +import { StorageEngine } from 'multer'; +import { Readable } from 'stream'; +import { IUploadProvider } from './upload.interface'; +import { UploadFactory } from './upload.factory'; +import { getMaxSize, uploadStreamToStorage } from './custom.upload.validation'; + +// Multer storage engine that streams each incoming file straight into +// storage instead of multer's default of buffering it whole in memory. +// `file.filename` / `file.path` end up as the stored key and public URL, +// `file.originalname` keeps the sender's name with the detected extension +export class MulterStreamEngine implements StorageEngine { + constructor(private storage: IUploadProvider) {} + + _handleFile( + req: Request, + file: Express.Multer.File, + cb: (error?: any, info?: Partial) => void + ) { + uploadStreamToStorage( + this.storage, + Readable.toWeb(file.stream) as any + ).then( + (uploaded) => { + const safeBase = + (file.originalname || 'upload') + .replace(/\.[^./\\]*$/, '') + .replace(/[\\/]/g, '_') + .slice(0, 100) || 'upload'; + cb(null, { + filename: uploaded.filename, + path: uploaded.path, + mimetype: uploaded.mimetype, + originalname: `${safeBase}.${uploaded.ext}`, + }); + }, + (err) => cb(err) + ); + } + + // Multer calls this when the request fails after the file was already + // stored (e.g. another part hit a limit), so the orphan is dropped + _removeFile( + req: Request, + file: Express.Multer.File, + cb: (error: Error | null) => void + ) { + this.storage.removeFile(file.path).then( + () => cb(null), + (err) => cb(err) + ); + } +} + +let engine: MulterStreamEngine; + +// Options for FileInterceptor on the multipart upload routes. Multer's own +// limit sits one byte above the largest allowed type so the in-stream cap is +// what rejects (a uniform 400 that aborts the upload) rather than multer +// truncating the file, storing it whole and only then failing with a 413 +export function streamUploadOptions() { + engine = engine || new MulterStreamEngine(UploadFactory.createStorage()); + return { + storage: engine, + limits: { fileSize: getMaxSize('video/mp4') + 1 }, + }; +} diff --git a/libraries/nestjs-libraries/src/upload/upload.interface.ts b/libraries/nestjs-libraries/src/upload/upload.interface.ts index 73230f1107..3fda973527 100644 --- a/libraries/nestjs-libraries/src/upload/upload.interface.ts +++ b/libraries/nestjs-libraries/src/upload/upload.interface.ts @@ -1,6 +1,23 @@ +import { Readable } from 'stream'; + +export interface UploadedStream { + filename: string; + originalname: string; + path: string; + mimetype: string; +} + export interface IUploadProvider { uploadSimple(path: string): Promise; uploadFile(file: Express.Multer.File): Promise; + // Streams the body straight into storage without buffering it. The caller + // has already sniffed the real type from the first bytes, so it passes the + // detected mime/ext instead of the provider re-sniffing a buffer + uploadStream( + stream: Readable, + mimetype: string, + ext: string + ): Promise; removeFile(filePath: string): Promise; // Presigned URLs handed to the media processor, which has no storage // credentials; only cloud storage can mint them diff --git a/libraries/nestjs-libraries/src/upload/upload.module.ts b/libraries/nestjs-libraries/src/upload/upload.module.ts index aa03d86e69..2853315ad7 100644 --- a/libraries/nestjs-libraries/src/upload/upload.module.ts +++ b/libraries/nestjs-libraries/src/upload/upload.module.ts @@ -1,10 +1,9 @@ import { Global, Module } from '@nestjs/common'; import { UploadFactory } from './upload.factory'; -import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; @Global() @Module({ - providers: [UploadFactory, CustomFileValidationPipe], - exports: [UploadFactory, CustomFileValidationPipe], + providers: [UploadFactory], + exports: [UploadFactory], }) export class UploadModule {} diff --git a/package.json b/package.json index 27223fbcd6..54a87c224d 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@ai-sdk/openai": "^2.0.52", "@atproto/api": "^0.15.15", "@aws-sdk/client-s3": "^3.787.0", + "@aws-sdk/lib-storage": "^3.1003.0", "@aws-sdk/s3-request-presigner": "^3.787.0", "@casl/ability": "^6.5.0", "@copilotkit/react-core": "1.10.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a45e55f4a..10b6dadc0d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@aws-sdk/client-s3': specifier: ^3.787.0 version: 3.1003.0 + '@aws-sdk/lib-storage': + specifier: ^3.1003.0 + version: 3.1003.0(@aws-sdk/client-s3@3.1003.0) '@aws-sdk/s3-request-presigner': specifier: ^3.787.0 version: 3.1003.0 @@ -1168,6 +1171,12 @@ packages: resolution: {integrity: sha512-g2Z9s6Y4iNh0wICaEqutgYgt/Pmhv5Ev9G3eKGFe2w9VuZDhc76vYdop6I5OocmpHV79d4TuLG+JWg5rQIVDVA==} engines: {node: '>=20.0.0'} + '@aws-sdk/lib-storage@3.1003.0': + resolution: {integrity: sha512-tyc2WazRhlBNdJu1Vpi7v9Oak8gl4zo0521MYOZustCmdSvGmV8kJdOEa4VK8pUPvm2D7mRgdiNRqesy87gcuQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@aws-sdk/client-s3': ^3.1003.0 + '@aws-sdk/middleware-bucket-endpoint@3.972.7': resolution: {integrity: sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA==} engines: {node: '>=20.0.0'} @@ -7289,6 +7298,10 @@ packages: resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} engines: {node: '>=18.0.0'} + '@smithy/types@4.18.0': + resolution: {integrity: sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.2.11': resolution: {integrity: sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing==} engines: {node: '>=18.0.0'} @@ -10131,6 +10144,9 @@ packages: buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.6.0: + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -19131,7 +19147,7 @@ snapshots: '@smithy/property-provider': 4.2.11 '@smithy/protocol-http': 5.3.11 '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -19191,7 +19207,18 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.5 '@smithy/eventstream-codec': 4.2.11 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 + tslib: 2.8.1 + + '@aws-sdk/lib-storage@3.1003.0(@aws-sdk/client-s3@3.1003.0)': + dependencies: + '@aws-sdk/client-s3': 3.1003.0 + '@smithy/abort-controller': 4.2.11 + '@smithy/middleware-endpoint': 4.4.22 + '@smithy/smithy-client': 4.12.2 + buffer: 5.6.0 + events: 3.3.0 + stream-browserify: 3.0.0 tslib: 2.8.1 '@aws-sdk/middleware-bucket-endpoint@3.972.7': @@ -19208,7 +19235,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.973.5 '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 '@aws-sdk/middleware-expect-continue@3.972.7': @@ -19304,7 +19331,7 @@ snapshots: '@smithy/fetch-http-handler': 5.3.13 '@smithy/protocol-http': 5.3.11 '@smithy/signature-v4': 5.3.11 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/util-base64': 4.3.2 '@smithy/util-hex-encoding': 4.2.2 '@smithy/util-utf8': 4.2.2 @@ -19338,7 +19365,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -19388,7 +19415,7 @@ snapshots: '@aws-sdk/types': 3.973.5 '@smithy/property-provider': 4.2.11 '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -25886,7 +25913,7 @@ snapshots: '@smithy/abort-controller@4.2.11': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.2.3': @@ -25931,7 +25958,7 @@ snapshots: '@smithy/eventstream-codec@4.2.11': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 @@ -26115,6 +26142,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/types@4.18.0': + dependencies: + tslib: 2.8.1 + '@smithy/url-parser@4.2.11': dependencies: '@smithy/querystring-parser': 4.2.11 @@ -30007,6 +30038,11 @@ snapshots: buffer-xor@1.0.3: {} + buffer@5.6.0: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@5.7.1: dependencies: base64-js: 1.5.1 From 920da9ce562cc0e367d35a54671d0ec163ca3d3d Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 00:15:52 +0700 Subject: [PATCH 37/61] fix(oauth): grant email claims to DCR clients on verified domains The ChatGPT Apps builder registers its own client through DCR and, with OIDC enabled, calls /oauth/userinfo after the token exchange. Only the static OPENAI_OAUTH_CLIENT_ID app was allowed the openid/email scope and a userinfo answer, so every builder client got a narrowed scope and a 403, which ChatGPT reports as "Missing OAuth callback data". allowsEmailClaims() keeps the static app and additionally trusts dynamic clients whose https callbacks all sit on a DCR_VERIFIED_DOMAINS host. Loopback-only / private-scheme clients and installs with an empty verified list keep getting mcp scopes only. Co-Authored-By: Claude Fable 5.1 --- .../database/prisma/oauth/oauth.repository.ts | 2 + .../database/prisma/oauth/oauth.service.ts | 71 +++++++++++++++---- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts index 50663d7fca..e7fe30fcba 100644 --- a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.repository.ts @@ -236,6 +236,8 @@ export class OAuthRepository { oauthApp: { select: { clientId: true, + dynamic: true, + redirectUris: true, }, }, organization: { diff --git a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts index 5c4e20b981..19adfe0f68 100644 --- a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts @@ -7,18 +7,21 @@ import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { AuthService } from '@gitroom/helpers/auth/auth.service'; import { extractBearerToken } from '@gitroom/nestjs-libraries/chat/oauth-types'; import { createHash } from 'crypto'; +import { OAuthApp } from '@prisma/client'; const openAiOAuthClientId = () => process.env.OPENAI_OAUTH_CLIENT_ID?.trim(); const enableOidcEmailClaims = () => Boolean(openAiOAuthClientId()); -const oauthScope = (clientId: string) => - [ - ...(clientId === openAiOAuthClientId() ? ['openid', 'email'] : []), - 'mcp:read', - 'mcp:write', - ].join(' '); +// Verified-domain match: exact host or a subdomain of it (spoof-safe, the +// leading dot means evilclaude.ai and claude.ai.evil.com are both rejected) +const isVerifiedHost = (host: string, verifiedDomains: string[]) => + verifiedDomains.some( + (domain) => host === domain || host.endsWith('.' + domain) + ); + +type EmailClaimsApp = Pick; // Schemes a browser would execute instead of navigating away from the // consent screen, so they can never be a redirect_uri @@ -152,10 +155,7 @@ export class OAuthService { } const host = parsed.hostname.toLowerCase(); - const isVerified = verifiedDomains.some( - (domain) => host === domain || host.endsWith('.' + domain) - ); - if (!isVerified) { + if (!isVerifiedHost(host, verifiedDomains)) { throw new HttpException( { error: 'invalid_redirect_uri', @@ -205,6 +205,53 @@ export class OAuthService { }; } + // Email claims (openid/email scope + userinfo) go to the static ChatGPT app + // and to dynamically registered clients whose web callbacks all live on a + // verified domain (DCR_VERIFIED_DOMAINS). Everything else, including every + // dynamic client on a self-hosted install with no verified domains, only + // gets the mcp scopes + private allowsEmailClaims(app: EmailClaimsApp) { + if (!enableOidcEmailClaims()) { + return false; + } + if (app.clientId === openAiOAuthClientId()) { + return true; + } + if (!app.dynamic) { + return false; + } + + const verifiedDomains = this.verifiedDomainList(); + if (!verifiedDomains.length) { + return false; + } + + const webHosts: string[] = []; + for (const uri of JSON.parse(app.redirectUris || '[]') as string[]) { + try { + const parsed = new URL(uri); + if (parsed.protocol === 'https:') { + webHosts.push(parsed.hostname.toLowerCase()); + } + } catch { + return false; + } + } + + return ( + webHosts.length > 0 && + webHosts.every((host) => isVerifiedHost(host, verifiedDomains)) + ); + } + + private grantedScope(app: EmailClaimsApp) { + return [ + ...(this.allowsEmailClaims(app) ? ['openid', 'email'] : []), + 'mcp:read', + 'mcp:write', + ].join(' '); + } + async validateAuthorizationRequest( clientId: string, options?: { @@ -359,7 +406,7 @@ export class OAuthService { cus: paymentId, access_token: token, token_type: 'bearer', - scope: oauthScope(clientId), + scope: this.grantedScope(app), }; } @@ -395,7 +442,7 @@ export class OAuthService { ); } - if (authorizationRecord.oauthApp.clientId !== openAiOAuthClientId()) { + if (!this.allowsEmailClaims(authorizationRecord.oauthApp)) { throw new HttpException( { error: 'insufficient_scope', From f22d8c82d6d959a14628da91a50b01afe1e187eb Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 01:03:03 +0700 Subject: [PATCH 38/61] feat(oauth): accept client_secret_basic on the token endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RFC 6749 §2.3.1 requires the token endpoint to accept HTTP Basic client authentication for clients that hold a secret. Until now only client_secret_post worked, so a client sending the id and secret in the Authorization header failed validation before the code was checked. - extractBasicCredentials() next to extractBearerToken() decodes the header - the token controller merges header credentials with the body - registration mirrors back client_secret_basic when a client asks for it - both discovery documents advertise client_secret_basic Co-Authored-By: Claude Fable 5.1 --- .../src/api/routes/oauth.controller.ts | 21 +++++++++++-- .../nestjs-libraries/src/chat/oauth-types.ts | 30 +++++++++++++++++++ .../nestjs-libraries/src/chat/start.mcp.ts | 4 +-- .../database/prisma/oauth/oauth.service.ts | 11 +++++-- .../src/dtos/oauth/token-exchange.dto.ts | 7 +++-- 5 files changed, 64 insertions(+), 9 deletions(-) diff --git a/apps/backend/src/api/routes/oauth.controller.ts b/apps/backend/src/api/routes/oauth.controller.ts index 9076b75b5c..da4db28de5 100644 --- a/apps/backend/src/api/routes/oauth.controller.ts +++ b/apps/backend/src/api/routes/oauth.controller.ts @@ -17,6 +17,7 @@ import { User, Organization } from '@prisma/client'; import { AuthorizeOAuthQueryDto, ApproveOAuthDto } from '@gitroom/nestjs-libraries/dtos/oauth/authorize-oauth.dto'; import { TokenExchangeDto } from '@gitroom/nestjs-libraries/dtos/oauth/token-exchange.dto'; import { RegisterClientDto } from '@gitroom/nestjs-libraries/dtos/oauth/register-client.dto'; +import { extractBasicCredentials } from '@gitroom/nestjs-libraries/chat/oauth-types'; @ApiTags('OAuth') @Controller('/oauth') @@ -54,7 +55,10 @@ export class OAuthController { } @Post('/token') - async token(@Body() body: TokenExchangeDto) { + async token( + @Body() body: TokenExchangeDto, + @Headers('authorization') authorization?: string + ) { if (body.grant_type !== 'authorization_code') { throw new HttpException( { error: 'unsupported_grant_type' }, @@ -62,10 +66,21 @@ export class OAuthController { ); } + // client_secret_basic puts the credentials in the Authorization header, + // client_secret_post and public clients put them in the body + const basic = extractBasicCredentials(authorization); + const clientId = basic?.clientId || body.client_id; + if (!clientId) { + throw new HttpException( + { error: 'invalid_client' }, + HttpStatus.UNAUTHORIZED + ); + } + return this._oauthService.exchangeCodeForToken( body.code, - body.client_id, - body.client_secret, + clientId, + basic?.clientSecret || body.client_secret, body.code_verifier, body.redirect_uri ); diff --git a/libraries/nestjs-libraries/src/chat/oauth-types.ts b/libraries/nestjs-libraries/src/chat/oauth-types.ts index 67b4ec4486..720625c84f 100644 --- a/libraries/nestjs-libraries/src/chat/oauth-types.ts +++ b/libraries/nestjs-libraries/src/chat/oauth-types.ts @@ -92,6 +92,36 @@ export function generateProtectedResourceMetadata(config: MCPServerOAuthConfig): }; } +// RFC 6749 §2.3.1 client_secret_basic: "Basic base64(urlencode(id):urlencode(secret))" +export function extractBasicCredentials( + authHeader: string | null | undefined, +): { clientId: string; clientSecret: string } | undefined { + if (!authHeader) return undefined; + + const prefix = 'basic '; + if (authHeader.length <= prefix.length) return undefined; + if (authHeader.slice(0, prefix.length).toLowerCase() !== prefix) return undefined; + + let decoded: string; + try { + decoded = Buffer.from(authHeader.slice(prefix.length).trim(), 'base64').toString('utf8'); + } catch { + return undefined; + } + + const separator = decoded.indexOf(':'); + if (separator <= 0) return undefined; + + try { + return { + clientId: decodeURIComponent(decoded.slice(0, separator)), + clientSecret: decodeURIComponent(decoded.slice(separator + 1)), + }; + } catch { + return undefined; + } +} + export function extractBearerToken(authHeader: string | null | undefined): string | undefined { if (!authHeader) return undefined; diff --git a/libraries/nestjs-libraries/src/chat/start.mcp.ts b/libraries/nestjs-libraries/src/chat/start.mcp.ts index 8890799215..74e8b6abd3 100644 --- a/libraries/nestjs-libraries/src/chat/start.mcp.ts +++ b/libraries/nestjs-libraries/src/chat/start.mcp.ts @@ -165,7 +165,7 @@ export const startMcp = async (app: INestApplication) => { }), response_types_supported: ['code'], grant_types_supported: ['authorization_code'], - token_endpoint_auth_methods_supported: ['client_secret_post', 'none'], + token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post', 'none'], code_challenge_methods_supported: ['S256'], scopes_supported: oauthScopes, }); @@ -195,7 +195,7 @@ export const startMcp = async (app: INestApplication) => { userinfo_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/userinfo`, response_types_supported: ['code'], grant_types_supported: ['authorization_code'], - token_endpoint_auth_methods_supported: ['client_secret_post', 'none'], + token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post', 'none'], code_challenge_methods_supported: ['S256'], scopes_supported: oauthScopes, subject_types_supported: ['public'], diff --git a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts index 19adfe0f68..3b7cffe43f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/oauth/oauth.service.ts @@ -180,6 +180,13 @@ export class OAuthService { .catch(() => {}); const isPublicClient = dto.token_endpoint_auth_method === 'none'; + // The token endpoint accepts the secret from either place; the stored + // method only mirrors back what the client asked for + const tokenEndpointAuthMethod = isPublicClient + ? 'none' + : dto.token_endpoint_auth_method === 'client_secret_basic' + ? 'client_secret_basic' + : 'client_secret_post'; const clientId = 'pcd_' + makeId(32); const clientSecret = isPublicClient ? undefined : 'pcs_' + makeId(48); @@ -189,7 +196,7 @@ export class OAuthService { redirectUris: JSON.stringify(redirectUris), clientId, clientSecret: clientSecret && AuthService.fixedEncryption(clientSecret), - tokenEndpointAuthMethod: isPublicClient ? 'none' : 'client_secret_post', + tokenEndpointAuthMethod, }); return { @@ -198,7 +205,7 @@ export class OAuthService { client_id_issued_at: Math.floor(app.createdAt.getTime() / 1000), client_name: app.name, redirect_uris: redirectUris, - token_endpoint_auth_method: isPublicClient ? 'none' : 'client_secret_post', + token_endpoint_auth_method: tokenEndpointAuthMethod, grant_types: ['authorization_code'], response_types: ['code'], scope: 'mcp:read mcp:write', diff --git a/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts b/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts index 36a3c22bf4..ca3b3b7fe2 100644 --- a/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/oauth/token-exchange.dto.ts @@ -9,9 +9,12 @@ export class TokenExchangeDto { @IsDefined() code: string; + // Optional here because client_secret_basic clients send the id and secret + // in the Authorization header; the controller merges the two sources and + // the service rejects a request that ends up without a client_id @IsString() - @IsDefined() - client_id: string; + @IsOptional() + client_id?: string; // Optional to allow PKCE-only public clients (dynamic registration); // the service still enforces it for confidential clients From 2a0d6885d3786c1f5b0812ab0ff479126320155c Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 01:42:27 +0700 Subject: [PATCH 39/61] feat(mcp): separate no-DCR issuer for /mcp-oauth, DCR issuer for the rest The OpenAI Apps builder auto-selects DCR whenever the discovered authorization server advertises a registration_endpoint. /mcp-oauth is the ChatGPT app submission path and should default to the pre-defined client credentials, so it now has its own RFC 8414 issuer without the registration endpoint. /mcp-oauth-claude and /mcp-oauth-dynamic point at a second issuer, /mcp-oauth-dynamic, that still advertises DCR for Claude, Cursor and other self-registering clients. Both issuers share the same authorize, token and userinfo endpoints; tokens are opaque so existing connections are unaffected. Co-Authored-By: Claude Fable 5.1 --- .../nestjs-libraries/src/chat/start.mcp.ts | 89 +++++++++++-------- 1 file changed, 51 insertions(+), 38 deletions(-) diff --git a/libraries/nestjs-libraries/src/chat/start.mcp.ts b/libraries/nestjs-libraries/src/chat/start.mcp.ts index 74e8b6abd3..6c1d959001 100644 --- a/libraries/nestjs-libraries/src/chat/start.mcp.ts +++ b/libraries/nestjs-libraries/src/chat/start.mcp.ts @@ -81,16 +81,51 @@ export const startMcp = async (app: INestApplication) => { tools: claudeTools, }); - const oauthResource = new URL('/mcp-oauth', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(); + const backendUrl = process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL; + + // Two RFC 8414 path-based issuers backed by the same endpoints and code. + // /mcp-oauth is what the ChatGPT app submission points at: it does not + // advertise a registration_endpoint, so the OpenAI builder defaults to the + // pre-defined client credentials instead of DCR. /mcp-oauth-dynamic keeps + // DCR for Claude, Cursor and every other self-registering client + const authorizationServers: Record = { + '/mcp-oauth': { + issuer: new URL('/mcp-oauth', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), + registration: false, + }, + '/mcp-oauth-dynamic': { + issuer: new URL('/mcp-oauth-dynamic', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), + registration: true, + }, + }; + + const authorizationServerMetadata = (server: { issuer: string; registration: boolean }) => ({ + // RFC 8414: metadata served at /.well-known/oauth-authorization-server/ + // belongs to the path-based issuer / + issuer: server.issuer, + authorization_endpoint: `${process.env.FRONTEND_URL}/oauth/authorize`, + token_endpoint: `${backendUrl}/oauth/token`, + ...(server.registration && { + registration_endpoint: `${backendUrl}/oauth/register`, + }), + ...(enableOidcEmailClaims && { + userinfo_endpoint: `${backendUrl}/oauth/userinfo`, + }), + response_types_supported: ['code'], + grant_types_supported: ['authorization_code'], + token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post', 'none'], + code_challenge_methods_supported: ['S256'], + scopes_supported: oauthScopes, + }); - // Every OAuth-protected MCP path is its own RFC 9728 protected resource, but - // they all share the /mcp-oauth authorization server (the token endpoint - // ignores the RFC 8707 resource param, so one AS covers all of them) - const createResourceMiddleware = (mcpPath: string) => + // Every OAuth-protected MCP path is its own RFC 9728 protected resource + // (the token endpoint ignores the RFC 8707 resource param, so the issuers + // above cover all of them) + const createResourceMiddleware = (mcpPath: string, authorizationServer: string) => createOAuthMiddleware({ oauth: { resource: new URL(mcpPath, process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), - authorizationServers: [oauthResource], + authorizationServers: [authorizationServers[authorizationServer].issuer], scopesSupported: oauthScopes, validateToken: async (token: string) => { const org = await resolveAuth(token); @@ -107,13 +142,13 @@ export const startMcp = async (app: INestApplication) => { string, { middleware: ReturnType; mcpServer: MCPServer } > = { - // ChatGPT app submission - '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth'), mcpServer: oauthServer }, + // ChatGPT app submission (pre-defined client credentials, no DCR) + '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth', '/mcp-oauth'), mcpServer: oauthServer }, // Claude connector directory submission - '/mcp-oauth-claude': { middleware: createResourceMiddleware('/mcp-oauth-claude'), mcpServer: claudeOauthServer }, + '/mcp-oauth-claude': { middleware: createResourceMiddleware('/mcp-oauth-claude', '/mcp-oauth-dynamic'), mcpServer: claudeOauthServer }, // Clients that register themselves through DCR (/oauth/register) - not // directory-reviewed, so they get the full toolset (media generation included) - '/mcp-oauth-dynamic': { middleware: createResourceMiddleware('/mcp-oauth-dynamic'), mcpServer: oauthServer }, + '/mcp-oauth-dynamic': { middleware: createResourceMiddleware('/mcp-oauth-dynamic', '/mcp-oauth-dynamic'), mcpServer: oauthServer }, }; if (process.env.OPENAI_APP_CHALLANGE) { @@ -138,7 +173,8 @@ export const startMcp = async (app: INestApplication) => { }); app.use('/.well-known/oauth-authorization-server', async (req: Request, res: Response, next: () => void) => { - if (req.path !== '/mcp-oauth') { + const server = authorizationServers[req.path]; + if (!server) { next(); return; } @@ -153,26 +189,12 @@ export const startMcp = async (app: INestApplication) => { } res.setHeader('Content-Type', 'application/json'); res.setHeader('Cache-Control', 'max-age=3600'); - res.json({ - // RFC 8414: metadata served at /.well-known/oauth-authorization-server/mcp-oauth - // belongs to the path-based issuer /mcp-oauth - issuer: oauthResource, - authorization_endpoint: `${process.env.FRONTEND_URL}/oauth/authorize`, - token_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/token`, - registration_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/register`, - ...(enableOidcEmailClaims && { - userinfo_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/userinfo`, - }), - response_types_supported: ['code'], - grant_types_supported: ['authorization_code'], - token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post', 'none'], - code_challenge_methods_supported: ['S256'], - scopes_supported: oauthScopes, - }); + res.json(authorizationServerMetadata(server)); }); app.use('/.well-known/openid-configuration', async (req: Request, res: Response, next: () => void) => { - if (req.path !== '/mcp-oauth' || !enableOidcEmailClaims) { + const server = authorizationServers[req.path]; + if (!server || !enableOidcEmailClaims) { next(); return; } @@ -188,16 +210,7 @@ export const startMcp = async (app: INestApplication) => { res.setHeader('Content-Type', 'application/json'); res.setHeader('Cache-Control', 'max-age=3600'); res.json({ - issuer: oauthResource, - authorization_endpoint: `${process.env.FRONTEND_URL}/oauth/authorize`, - token_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/token`, - registration_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/register`, - userinfo_endpoint: `${process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL}/oauth/userinfo`, - response_types_supported: ['code'], - grant_types_supported: ['authorization_code'], - token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post', 'none'], - code_challenge_methods_supported: ['S256'], - scopes_supported: oauthScopes, + ...authorizationServerMetadata(server), subject_types_supported: ['public'], claims_supported: ['sub', 'email', 'email_verified'], }); From 48490b815ddee008db8495933b0046f214c4d3da Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 01:51:10 +0700 Subject: [PATCH 40/61] feat(mcp): serve the ChatGPT app on /mcp-oauth-chatgpt OpenAI kept serving its cached copy of the /mcp-oauth authorization server metadata, so the ChatGPT app submission moves to a fresh path with its own issuer (no registration_endpoint, pre-defined client credentials). /mcp-oauth stays available on the dynamic issuer for connectors that were created against it. Co-Authored-By: Claude Fable 5.1 --- .../nestjs-libraries/src/chat/start.mcp.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/libraries/nestjs-libraries/src/chat/start.mcp.ts b/libraries/nestjs-libraries/src/chat/start.mcp.ts index 6c1d959001..3c28f38c4b 100644 --- a/libraries/nestjs-libraries/src/chat/start.mcp.ts +++ b/libraries/nestjs-libraries/src/chat/start.mcp.ts @@ -84,13 +84,15 @@ export const startMcp = async (app: INestApplication) => { const backendUrl = process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL; // Two RFC 8414 path-based issuers backed by the same endpoints and code. - // /mcp-oauth is what the ChatGPT app submission points at: it does not - // advertise a registration_endpoint, so the OpenAI builder defaults to the - // pre-defined client credentials instead of DCR. /mcp-oauth-dynamic keeps - // DCR for Claude, Cursor and every other self-registering client + // /mcp-oauth-chatgpt is what the ChatGPT app submission points at: it does + // not advertise a registration_endpoint, so the OpenAI builder defaults to + // the pre-defined client credentials instead of DCR (a fresh path, because + // OpenAI kept serving its cached copy of the old /mcp-oauth metadata). + // /mcp-oauth-dynamic keeps DCR for Claude, Cursor and every other + // self-registering client const authorizationServers: Record = { - '/mcp-oauth': { - issuer: new URL('/mcp-oauth', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), + '/mcp-oauth-chatgpt': { + issuer: new URL('/mcp-oauth-chatgpt', process.env.NEXT_PUBLIC_BACKEND_URL!).toString(), registration: false, }, '/mcp-oauth-dynamic': { @@ -143,7 +145,9 @@ export const startMcp = async (app: INestApplication) => { { middleware: ReturnType; mcpServer: MCPServer } > = { // ChatGPT app submission (pre-defined client credentials, no DCR) - '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth', '/mcp-oauth'), mcpServer: oauthServer }, + '/mcp-oauth-chatgpt': { middleware: createResourceMiddleware('/mcp-oauth-chatgpt', '/mcp-oauth-chatgpt'), mcpServer: oauthServer }, + // Former ChatGPT path, kept for connectors that were created against it + '/mcp-oauth': { middleware: createResourceMiddleware('/mcp-oauth', '/mcp-oauth-dynamic'), mcpServer: oauthServer }, // Claude connector directory submission '/mcp-oauth-claude': { middleware: createResourceMiddleware('/mcp-oauth-claude', '/mcp-oauth-dynamic'), mcpServer: claudeOauthServer }, // Clients that register themselves through DCR (/oauth/register) - not From 26885010e8197f1e295072955e395b95d79e5b4f Mon Sep 17 00:00:00 2001 From: Gilad Resisi Date: Wed, 1 Jul 2026 14:00:00 +0700 Subject: [PATCH 41/61] fix(customer-modal): replace Mantine Autocomplete with native input to fix React 19 warning The CustomerModal rendered `@mantine/core`'s ``, which triggered a React 19 console error ("Accessing element.ref was removed in React 19. ref is now a regular prop.") whenever the modal opened (e.g. adding a channel to a new group). The root cause is `@mantine/core@5.10.5` (Mantine v5, built for React 17/18) running under React 19, where the library internally accesses the now-removed `element.ref`. Replaced the single Autocomplete usage with a native `` + ``, styled to match the app's inputs. Free-text entry (needed to create a new customer/group) and existing-name suggestions are preserved. Scoped entirely to customer.modal.tsx; no dependency or behavior changes elsewhere. The alternative was to upgrade @mantine/core to a React 19-compatible major (v8), which was clearly unfavorable: Mantine is used in only two files, the project's convention is to prefer native components over npm UI libraries, and a v5->v8 bump is a large breaking change carrying far more risk than removing one component. Co-Authored-By: Claude Opus 4.8 --- .../components/launches/customer.modal.tsx | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/apps/frontend/src/components/launches/customer.modal.tsx b/apps/frontend/src/components/launches/customer.modal.tsx index 07b7b83a93..591a719bd7 100644 --- a/apps/frontend/src/components/launches/customer.modal.tsx +++ b/apps/frontend/src/components/launches/customer.modal.tsx @@ -3,7 +3,6 @@ import React, { FC, useCallback, useEffect, useState } from 'react'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import { Integration } from '@prisma/client'; -import { Autocomplete } from '@mantine/core'; import useSWR from 'swr'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { Button } from '@gitroom/react/form/button'; @@ -50,17 +49,24 @@ export const CustomerModal: FC<{ const { data } = useSWR('/customers', loadCustomers); return (
-
- + + setCustomer(e.target.value)} placeholder={t('start_typing', 'Start typing...')} - data={data?.map((p: any) => p.name) || []} + autoComplete="off" + className="bg-newBgColorInner h-[42px] border-newTableBorder border rounded-[8px] text-textColor placeholder-textColor px-[16px] text-[14px] outline-none" /> + + {(data?.map((p: any) => p.name) || []).map((name: string) => ( +
From c589175aae6040aae87c9fe0df1f70d6e266a82d Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 16:10:07 +0700 Subject: [PATCH 42/61] chore(deps): upgrade Mastra and CopilotKit to latest Mastra core 1.67 / mcp 1.18 / memory 1.30 / pg 1.25 / cli 1.30, CopilotKit 1.72 and @ag-ui/mastra 1.1.4. CopilotKit 1.72 adaptations: /copilot/agent uses the node-http handler, explicit CORS on both copilot routes, integrations read from the single-route envelope (forwardedProps), root type imports, interrupt via useCopilotChatInternal, multimodal message content, useSingleEndpoint on the providers. Pin @types/express v5 and declare runtime-client-gql. Co-Authored-By: Claude Fable 5.1 --- .../src/api/routes/copilot.controller.ts | 20 +- .../src/components/agents/agent.chat.tsx | 20 +- .../src/components/agents/agent.input.tsx | 19 +- .../new-layout/layout.component.tsx | 1 + .../components/preview/preview.wrapper.tsx | 1 + package.json | 22 +- pnpm-lock.yaml | 6758 ++++++++++++----- 7 files changed, 4746 insertions(+), 2095 deletions(-) diff --git a/apps/backend/src/api/routes/copilot.controller.ts b/apps/backend/src/api/routes/copilot.controller.ts index 9a8f0a272d..63d8ed090c 100644 --- a/apps/backend/src/api/routes/copilot.controller.ts +++ b/apps/backend/src/api/routes/copilot.controller.ts @@ -12,7 +12,6 @@ import { CopilotRuntime, OpenAIAdapter, copilotRuntimeNodeHttpEndpoint, - copilotRuntimeNextJSAppRouterEndpoint, } from '@copilotkit/runtime'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { Organization } from '@prisma/client'; @@ -30,6 +29,16 @@ export type ChannelsContext = { ui: string; }; +// the copilot runtime writes its own CORS headers on the response, keep them aligned with main.ts +const copilotCors = () => ({ + origin: [ + process.env.FRONTEND_URL, + 'http://localhost:6274', + ...(process.env.MAIN_URL ? [process.env.MAIN_URL] : []), + ], + credentials: !process.env.NOT_SECURED, +}); + @Controller('/copilot') export class CopilotController { constructor( @@ -48,6 +57,7 @@ export class CopilotController { const copilotRuntimeHandler = copilotRuntimeNodeHttpEndpoint({ endpoint: '/copilot/chat', + cors: copilotCors(), runtime: new CopilotRuntime(), serviceAdapter: new OpenAIAdapter({ model: 'gpt-4.1', @@ -75,7 +85,7 @@ export class CopilotController { const requestContext = new RequestContext(); requestContext.set( 'integrations', - req?.body?.variables?.properties?.integrations || [] + req?.body?.body?.forwardedProps?.integrations || [] ); requestContext.set('organization', JSON.stringify(organization)); @@ -91,16 +101,16 @@ export class CopilotController { agents, }); - const copilotRuntimeHandler = copilotRuntimeNextJSAppRouterEndpoint({ + const copilotRuntimeHandler = copilotRuntimeNodeHttpEndpoint({ endpoint: '/copilot/agent', + cors: copilotCors(), runtime, - // properties: req.body.variables.properties, serviceAdapter: new OpenAIAdapter({ model: 'gpt-4.1', }), }); - return copilotRuntimeHandler.handleRequest(req, res); + return copilotRuntimeHandler(req, res); } @Get('/credits') diff --git a/apps/frontend/src/components/agents/agent.chat.tsx b/apps/frontend/src/components/agents/agent.chat.tsx index b12cdc85fe..80168237a7 100644 --- a/apps/frontend/src/components/agents/agent.chat.tsx +++ b/apps/frontend/src/components/agents/agent.chat.tsx @@ -9,11 +9,12 @@ import React, { useRef, useState, } from 'react'; -import { CopilotChat, CopilotKitCSSProperties } from '@copilotkit/react-ui'; import { + CopilotChat, + CopilotKitCSSProperties, InputProps, UserMessageProps, -} from '@copilotkit/react-ui/dist/components/chat/props'; +} from '@copilotkit/react-ui'; import { Input } from '@gitroom/frontend/components/agents/agent.input'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import { @@ -50,6 +51,7 @@ export const AgentChat: FC = () => { {...(params.id === 'new' ? {} : { threadId: params.id })} credentials="include" runtimeUrl={backendUrl + '/copilot/agent'} + useSingleEndpoint={true} showDevConsole={false} agent="postiz" properties={{ @@ -104,7 +106,11 @@ const LoadMessages: FC<{ id: string }> = ({ id }) => { const data = await (await fetch(`/copilot/${idToSet}/list`)).json(); const list = data.messages.map((p: any) => { return new TextMessage({ - content: p.content.content, + content: + p.content.content || + (p.content.parts || []) + .map((part: any) => (part.type === 'text' ? part.text : '')) + .join(''), role: p.role, }); }); @@ -150,7 +156,13 @@ const LoadMessages: FC<{ id: string }> = ({ id }) => { const Message: FC = (props) => { const convertContentToImagesAndVideo = useMemo(() => { - return (props.message?.content || '') + const content = props.message?.content || ''; + const text = + typeof content === 'string' + ? content + : content.map((p) => (p.type === 'text' ? p.text : '')).join(''); + + return text .replace(/Video: (http.*mp4\n)/g, (match, p1) => { return ``; }) diff --git a/apps/frontend/src/components/agents/agent.input.tsx b/apps/frontend/src/components/agents/agent.input.tsx index 85d22b9b05..7e59cc5693 100644 --- a/apps/frontend/src/components/agents/agent.input.tsx +++ b/apps/frontend/src/components/agents/agent.input.tsx @@ -1,8 +1,11 @@ import React, { useMemo, useRef, useState } from 'react'; -import { useCopilotContext, useCopilotReadable } from '@copilotkit/react-core'; +import { + useCopilotChatInternal, + useCopilotContext, + useCopilotReadable, +} from '@copilotkit/react-core'; import AutoResizingTextarea from '@gitroom/frontend/components/agents/agent.textarea'; -import { useChatContext } from '@copilotkit/react-ui'; -import { InputProps } from '@copilotkit/react-ui/dist/components/chat/props'; +import { useChatContext, InputProps } from '@copilotkit/react-ui'; const MAX_NEWLINES = 6; export const Input = ({ @@ -49,14 +52,10 @@ export const Input = ({ ? context.icons.stopIcon : context.icons.sendIcon; + const { interrupt } = useCopilotChatInternal(); const canSend = useMemo(() => { - const interruptEvent = copilotContext.langGraphInterruptAction?.event; - const interruptInProgress = - interruptEvent?.name === 'LangGraphInterruptEvent' && - !interruptEvent?.response; - - return !isInProgress && text.trim().length > 0 && !interruptInProgress; - }, [copilotContext.langGraphInterruptAction?.event, isInProgress, text]); + return !isInProgress && text.trim().length > 0 && !interrupt; + }, [interrupt, isInProgress, text]); const canStop = useMemo(() => { return isInProgress && !hideStopButton; diff --git a/apps/frontend/src/components/new-layout/layout.component.tsx b/apps/frontend/src/components/new-layout/layout.component.tsx index 18b7e651fd..6d47d15f41 100644 --- a/apps/frontend/src/components/new-layout/layout.component.tsx +++ b/apps/frontend/src/components/new-layout/layout.component.tsx @@ -81,6 +81,7 @@ export const LayoutComponent = ({ children }: { children: ReactNode }) => { diff --git a/apps/frontend/src/components/preview/preview.wrapper.tsx b/apps/frontend/src/components/preview/preview.wrapper.tsx index f2922aba19..85df00de49 100644 --- a/apps/frontend/src/components/preview/preview.wrapper.tsx +++ b/apps/frontend/src/components/preview/preview.wrapper.tsx @@ -27,6 +27,7 @@ export const PreviewWrapper = ({ children }: { children: ReactNode }) => { diff --git a/package.json b/package.json index 54a87c224d..5c87482e31 100644 --- a/package.json +++ b/package.json @@ -40,17 +40,18 @@ "test": "jest --coverage --detectOpenHandles --reporters=default --reporters=jest-junit" }, "dependencies": { - "@ag-ui/mastra": "^1.0.1", + "@ag-ui/mastra": "^1.1.4", "@ai-sdk/openai": "^2.0.52", "@atproto/api": "^0.15.15", "@aws-sdk/client-s3": "^3.787.0", "@aws-sdk/lib-storage": "^3.1003.0", "@aws-sdk/s3-request-presigner": "^3.787.0", "@casl/ability": "^6.5.0", - "@copilotkit/react-core": "1.10.6", - "@copilotkit/react-textarea": "1.10.6", - "@copilotkit/react-ui": "1.10.6", - "@copilotkit/runtime": "1.10.6", + "@copilotkit/react-core": "1.72.0", + "@copilotkit/react-textarea": "1.72.0", + "@copilotkit/react-ui": "1.72.0", + "@copilotkit/runtime": "1.72.0", + "@copilotkit/runtime-client-gql": "1.72.0", "@dub/analytics": "^0.0.32", "@hookform/resolvers": "^3.3.4", "@langchain/community": "^1.1.27", @@ -62,10 +63,10 @@ "@mantine/dates": "^5.10.5", "@mantine/hooks": "^5.10.5", "@mantine/modals": "^5.10.5", - "@mastra/core": "^1.21.0", - "@mastra/mcp": "^1.4.1", - "@mastra/memory": "^1.13.0", - "@mastra/pg": "^1.8.5", + "@mastra/core": "^1.67.0", + "@mastra/mcp": "^1.18.0", + "@mastra/memory": "^1.30.0", + "@mastra/pg": "^1.25.0", "@meronex/icons": "^4.0.0", "@modelcontextprotocol/sdk": "^1.22.0", "@nest-lab/throttler-storage-redis": "^1.2.0", @@ -180,7 +181,7 @@ "json-to-graphql-query": "^2.2.5", "jsonwebtoken": "^9.0.2", "lodash": "^4.17.21", - "mastra": "^1.3.19", + "mastra": "^1.30.0", "md5": "^2.3.0", "mime": "^3.0.0", "mime-types": "^2.1.35", @@ -270,6 +271,7 @@ "@types/chrome": "^0.0.319", "@types/compression": "^1.8.1", "@types/cookie-parser": "^1.4.6", + "@types/express": "^5.0.6", "@types/jest": "29.5.12", "@types/node": "18.16.9", "@types/node-telegram-bot-api": "^0.64.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10b6dadc0d..195256bd8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: .: dependencies: '@ag-ui/mastra': - specifier: ^1.0.1 - version: 1.0.1(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@copilotkit/runtime@1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + specifier: ^1.1.4 + version: 1.1.4(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@copilotkit/runtime@1.72.0(060090e105863d9983aa04d300df3d3a))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76)) '@ai-sdk/openai': specifier: ^2.0.52 version: 2.0.98(zod@3.25.76) @@ -39,17 +39,20 @@ importers: specifier: ^6.5.0 version: 6.8.0 '@copilotkit/react-core': - specifier: 1.10.6 - version: 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.72.0 + version: 1.72.0(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) '@copilotkit/react-textarea': - specifier: 1.10.6 - version: 1.10.6(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.72.0 + version: 1.72.0(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) '@copilotkit/react-ui': - specifier: 1.10.6 - version: 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.72.0 + version: 1.72.0(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) '@copilotkit/runtime': - specifier: 1.10.6 - version: 1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1) + specifier: 1.72.0 + version: 1.72.0(060090e105863d9983aa04d300df3d3a) + '@copilotkit/runtime-client-gql': + specifier: 1.72.0 + version: 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) '@dub/analytics': specifier: ^0.0.32 version: 0.0.32 @@ -58,13 +61,13 @@ importers: version: 3.10.0(react-hook-form@7.71.2(react@19.2.4)) '@langchain/community': specifier: ^1.1.27 - version: 1.1.27(877e75223018bd2be751ee722fb15fb5) + version: 1.1.27(66046857593e81cf94589e5d63e1e984) '@langchain/core': specifier: ^1.1.39 version: 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@langchain/langgraph': specifier: ^1.2.8 - version: 1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76) + version: 1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.2(zod@3.25.76))(zod@3.25.76) '@langchain/openai': specifier: ^1.4.3 version: 1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) @@ -84,17 +87,17 @@ importers: specifier: ^5.10.5 version: 5.10.5(@mantine/core@5.10.5(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.2.4))(@mantine/hooks@5.10.5(react@19.2.4))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@mantine/hooks@5.10.5(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@mastra/core': - specifier: ^1.21.0 - version: 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) + specifier: ^1.67.0 + version: 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@mastra/mcp': - specifier: ^1.4.1 - version: 1.4.1(@cfworker/json-schema@4.1.1)(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@types/json-schema@7.0.15)(zod@3.25.76) + specifier: ^1.18.0 + version: 1.18.0(@cfworker/json-schema@4.1.1)(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(express@5.2.1)(hono@4.12.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) '@mastra/memory': - specifier: ^1.13.0 - version: 1.13.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + specifier: ^1.30.0 + version: 1.30.0(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76)) '@mastra/pg': - specifier: ^1.8.5 - version: 1.8.5(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + specifier: ^1.25.0 + version: 1.25.0(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76)) '@meronex/icons': specifier: ^4.0.0 version: 4.0.0(react@19.2.4) @@ -106,7 +109,7 @@ importers: version: 1.2.0(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@nestjs/throttler@6.5.0(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(reflect-metadata@0.2.2))(ioredis@5.10.0)(reflect-metadata@0.2.2) '@nestjs/cli': specifier: ^11.0.21 - version: 11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.27.7)(prettier@2.8.8) + version: 11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.28.2)(prettier@2.8.8) '@nestjs/common': specifier: ^11.1.21 version: 11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -136,7 +139,7 @@ importers: version: 0.0.30(@types/react@19.1.8)(react@19.2.4)(typescript@5.5.4) '@postiz/wallets': specifier: ^0.0.1 - version: 0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@prisma/client': specifier: 6.5.0 version: 6.5.0(prisma@6.5.0(typescript@5.5.4))(typescript@5.5.4) @@ -145,7 +148,7 @@ importers: version: 10.45.0(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21) '@sentry/nextjs': specifier: ^10.26.0 - version: 10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + version: 10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) '@sentry/profiling-node': specifier: ^10.25.0 version: 10.45.0 @@ -154,10 +157,10 @@ importers: version: 10.45.0(react@19.2.4) '@solana/wallet-adapter-react': specifier: ^0.15.35 - version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + version: 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@solana/wallet-adapter-react-ui': specifier: ^0.9.35 - version: 0.9.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + version: 0.9.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@stripe/react-stripe-js': specifier: ^5.4.1 version: 5.6.1(@stripe/stripe-js@8.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -184,7 +187,7 @@ importers: version: 1.15.0 '@temporalio/worker': specifier: ^1.14.0 - version: 1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1) + version: 1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1) '@temporalio/workflow': specifier: ^1.14.0 version: 1.15.0 @@ -438,8 +441,8 @@ importers: specifier: ^4.17.21 version: 4.17.23 mastra: - specifier: ^1.3.19 - version: 1.3.19(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76) + specifier: ^1.30.0 + version: 1.30.0(@hono/node-server@1.19.11(hono@4.12.10))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.1.0)(rxjs@7.8.2)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) md5: specifier: ^2.3.0 version: 2.3.0 @@ -463,13 +466,13 @@ importers: version: 3.0.1(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)) nestjs-temporal-core: specifier: ^3.2.0 - version: 3.2.3(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) + version: 3.2.3(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2) next: specifier: 16.3.1 - version: 16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + version: 16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) next-plausible: specifier: ^3.12.0 - version: 3.12.5(next@16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 3.12.5(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -493,7 +496,7 @@ importers: version: 6.0.1 polotno: specifier: ^3.0.0-beta.25 - version: 3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + version: 3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) posthog-js: specifier: ^1.178.0 version: 1.359.1 @@ -529,7 +532,7 @@ importers: version: 5.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-i18next: specifier: ^15.5.2 - version: 15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + version: 15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) react-loading: specifier: ^2.0.3 version: 2.0.3(prop-types@15.8.1)(react@19.2.4) @@ -662,7 +665,7 @@ importers: devDependencies: '@crxjs/vite-plugin': specifier: ^2.7.1 - version: 2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@nestjs/schematics': specifier: ^11.1.0 version: 11.1.0(chokidar@4.0.3)(prettier@2.8.8)(typescript@5.5.4) @@ -671,7 +674,7 @@ importers: version: 11.1.21(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@nestjs/microservices@11.1.21)(@nestjs/platform-express@11.1.21) '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.5.7 - version: 0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + version: 0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) '@svgr/webpack': specifier: ^8.0.1 version: 8.1.0(typescript@5.5.4) @@ -686,7 +689,7 @@ importers: version: 1.5.7(@swc/helpers@0.5.13) '@tailwindcss/vite': specifier: ^4.0.17 - version: 4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@testing-library/react': specifier: 16.3.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -702,6 +705,9 @@ importers: '@types/cookie-parser': specifier: ^1.4.6 version: 1.4.10(@types/express@5.0.6) + '@types/express': + specifier: ^5.0.6 + version: 5.0.6 '@types/jest': specifier: 29.5.12 version: 29.5.12 @@ -737,7 +743,7 @@ importers: version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) '@vitejs/plugin-react': specifier: ^6.0.5 - version: 6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@vitest/coverage-v8': specifier: 1.6.0 version: 1.6.0(vitest@3.1.4) @@ -749,7 +755,7 @@ importers: version: 10.4.27(postcss@8.5.26) babel-jest: specifier: 29.7.0 - version: 29.7.0(@babel/core@7.29.0) + version: 29.7.0(@babel/core@8.0.5) cross-env: specifier: ^10.0.0 version: 10.1.0 @@ -812,25 +818,25 @@ importers: version: 0.10.0 ts-jest: specifier: ^29.1.0 - version: 29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(esbuild@0.27.7)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4) + version: 29.4.6(@babel/core@8.0.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.5))(esbuild@0.28.2)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4) ts-node: specifier: 10.9.2 version: 10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4) tsup: specifier: ^8.5.0 - version: 8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.8.3) + version: 8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.9.1) typescript: specifier: 5.5.4 version: 5.5.4 vite: specifier: ^8.2.1 - version: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + version: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + version: 5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) vitest: specifier: 3.1.4 - version: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + version: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) apps/backend: {} @@ -862,38 +868,95 @@ packages: resolution: {integrity: sha512-VTDuRS5V0ATbJ/LkaQlisMnTAeYKXAK6scMguVBstf+KIBQ7HIuKhiXLv+G/hvejkV+THoXzoNifInAkU81P1g==} engines: {node: '>=18'} + '@a2a-js/sdk@0.3.14': + resolution: {integrity: sha512-F6Ew1AtPzCLhTn8h9yiqTe7DiDf6XVrSnq9V1YqSl9eWqPm6anMveTiKdCSb/76cW0YiJc24rNaUrVezFFHbqQ==} + engines: {node: '>=18'} + peerDependencies: + '@bufbuild/protobuf': ^2.10.2 + '@grpc/grpc-js': ^1.11.0 + express: ^4.21.2 || ^5.1.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + '@grpc/grpc-js': + optional: true + express: + optional: true + + '@a2a-js/sdk@1.0.1': + resolution: {integrity: sha512-CJQdh3Wzwo8qIx5UUkSJ7+7BEI16PB+MXMHHNSmx8JQsQed2HlQgvx1ENOiKUfYA3PlcEvxIwv14dBblhDuPmw==} + engines: {node: '>=20'} + peerDependencies: + '@bufbuild/protobuf': ^2.10.2 + '@grpc/grpc-js': ^1.11.0 + express: ^4.21.2 || ^5.1.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + '@grpc/grpc-js': + optional: true + express: + optional: true + + '@a2ui/web_core@0.10.4': + resolution: {integrity: sha512-sahOUSKZIGv9ZtnHjfzWR8o/F1XfSTp4sQAX5/auSenQYBYDRaY0+vrZIkddc/IEzpXJob6cFJT2r5/mLzAvqg==} + '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - '@ag-ui/client@0.0.47': - resolution: {integrity: sha512-zciVwYV6gmYzdMyWwSDR/VBcOj5x1lHPG/ZGDKyxDHbCeIdGp7sKoGORKHAiPAsfUhReGLKXsR/4IknqwY2PgQ==} + '@ag-ui/a2ui-middleware@0.0.10': + resolution: {integrity: sha512-2BQFUQ9vJzUAQSR0dNW/ijhyH8KpiRWISSLTP6mIe6ENyQ2cM1/XLG38/Dcb69olcs36gtZADZzAQWcno5H6fA==} + peerDependencies: + '@ag-ui/client': '>=0.0.40' + rxjs: 7.8.1 - '@ag-ui/core@0.0.37': - resolution: {integrity: sha512-7bmjPn1Ol0Zo00F+MrPr0eOwH4AFZbhmq/ZMhCsrMILtVYBiBLcLU9QFBpBL3Zm9MCHha8b79N7JE2FzwcMaVA==} + '@ag-ui/a2ui-toolkit@0.0.4': + resolution: {integrity: sha512-9VPmgpCAsFVICk7z23kh+Kp/BwYMxw0D0KGjOiKXhm1MAH+Wid2iC3yKsXso+q7UZZiyhWgeDUSgaAkltyLmGg==} - '@ag-ui/core@0.0.47': - resolution: {integrity: sha512-fHat7ZErAH028R90psYclTWaj6PdcvN2GJxzwWPF/j1c5ceqbF2+6xe+t06Psg+gCzZneI9QE3IkOkdJNplZ5A==} + '@ag-ui/client@0.0.59': + resolution: {integrity: sha512-d7++r8sBAq6z9G/D/WKrMznQ1Mdvew14pCqOVATReFIvl06mCi1BPqTwmos3zCDGAIiSgcvxc/8m472rYQgFFQ==} - '@ag-ui/encoder@0.0.47': - resolution: {integrity: sha512-AgKTM/DEHtaNrcbMa0z1UQ7lKiKtalbFAjBTTP0vCh+lJ6JWIu9LrpCJQ4EjON1IRoAZtJBORlCj1KY+F14HXQ==} + '@ag-ui/core@0.0.59': + resolution: {integrity: sha512-hDgy4ipTqXieT8YG8Mr917Y+FD/f11VK1GefZ5CwTDCuNqS/oTwjJ5l/DZkicThgS8hQW/Y7wPylPBMBJ8BkUg==} - '@ag-ui/langgraph@0.0.24': - resolution: {integrity: sha512-ebTYpUw28fvbmhqbpAbmfsDTfEqm1gSeZaBcnxMGHFivJLCzsJ/C9hYw6aV8yRKV3lMFBwh/QFxn1eRcr7yRkQ==} + '@ag-ui/encoder@0.0.59': + resolution: {integrity: sha512-wQCzBsStyZMm8nzhTdTx1G0B1C8yv5rbzZLnz1ka/l5LcJEsK3KTounU8CR9l+7QtcpOUUDJKd0xAbyI6gNcSw==} + + '@ag-ui/langgraph@0.0.43': + resolution: {integrity: sha512-eG8FBd7jQeo7lfraAz9fbuYM/sFJILnO7yFioCa/++cFygd5CpqpvVoUI1d/WEOzHYTwiuXYM5fPOQ8ZzQuYog==} peerDependencies: '@ag-ui/client': '>=0.0.42' '@ag-ui/core': '>=0.0.42' - '@ag-ui/mastra@1.0.1': - resolution: {integrity: sha512-8XcsAdZVweiQU7HeZW4sD9x4oXOk3VJ7piK3eihwIzVkEvd8YtfiPgwNlOzNxT6my8IHaHIuKtAlxLS/wo3TKQ==} + '@ag-ui/mastra@1.1.4': + resolution: {integrity: sha512-4snACp7ZSNRgHnSa0OIASoOMv6ytmEPWT4C+36yLc2c3YC4Heth84bhfnZhQBJ2Erjs1AluExzcpbB5CdVh2Yg==} peerDependencies: - '@ag-ui/client': '>=0.0.44' - '@ag-ui/core': '>=0.0.44' - '@copilotkit/runtime': 0.0.0-mme-ag-ui-0-0-46-20260227141603 + '@ag-ui/client': '>=0.0.58' + '@ag-ui/core': '>=0.0.58' + '@copilotkit/runtime': ^1.60.1 '@mastra/client-js': '>=1.0.0-0 <2.0.0-0' - '@mastra/core': '>=1.0.0-0 <2.0.0-0' + '@mastra/core': '>=1.29.0 <2.0.0-0' + + '@ag-ui/mcp-apps-middleware@0.1.1': + resolution: {integrity: sha512-bX02Hly+9oKTsBT+4RG7ntY9HSF1O+ysRHgXbkKY+ZNVYTCrtpiwgzUfQ1MqMPhBLbZUaVBh9uNfLVxU0maaNQ==} + peerDependencies: + '@ag-ui/client': '>=0.0.40' + rxjs: 7.8.1 + + '@ag-ui/mcp-middleware@0.0.2': + resolution: {integrity: sha512-+CwY9SUjXTvk1h77/nqpXEPj79i/Gt0G7ZEcZLlYsJHJkYYC8IG9yN/tiR++HS1Qb1R46btomrgoBfpBvpGwDw==} + peerDependencies: + '@ag-ui/client': '>=0.0.40' + rxjs: 7.8.1 - '@ag-ui/proto@0.0.47': - resolution: {integrity: sha512-+KCrkeVeR6MulWoYUq9Fwm22gFlI9aKG50eKYRtbTM/Yuei/Che5vjbF297XfSnGUunzScrOmdnTeTCprrtb7A==} + '@ag-ui/proto@0.0.59': + resolution: {integrity: sha512-X+uvDaegLEHw5kJu8tv2eSqHH8ouat+JCfFokGV1uuMquY8qCEQSlGsM7xzexwX9fujuxgHOWumg5kJDqa0+RA==} + + '@ai-sdk/anthropic@2.0.102': + resolution: {integrity: sha512-OGECnK9zIfZQQ++/py3lMDtFT1u43WQO7Js5V5esTOa2iu1E9gDYO5FsJq3DRHZiQlMwBUwIrKNKJfFk2zqgqw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 '@ai-sdk/anthropic@2.0.23': resolution: {integrity: sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw==} @@ -901,24 +964,66 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/anthropic@3.0.118': + resolution: {integrity: sha512-5j8Cc9owORxhhZxFtpznXPTdLxeWm6bPCVbndM0e+NdvGVxe9GDgNqQq1V0KqOV54hZ6hyQVEXHkgTRPyXzcQg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/gateway@1.0.33': resolution: {integrity: sha512-v9i3GPEo4t3fGcSkQkc07xM6KJN75VUv7C1Mqmmsu2xD8lQwnQfsrgAXyNuWe20yGY0eHuheSPDZhiqsGKtH1g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/gateway@3.0.196': + resolution: {integrity: sha512-YMsbvS2UiPKDdg+dSusbC+SR9KkKyWEvRcURysYrsGK9A3ZIzC7n+Pi+67exlXT2FXC+yvCP1O8z8bbvOJ2ABA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/google-vertex@3.0.174': + resolution: {integrity: sha512-L1DniqC5AwiTR/6k6NPrDbyZce5bjQbcTsR5ANQqLjz2ntnbtQaAtK6SNuOD/6jLayoqXVuO/MLqQEoIyDeuVg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/google@2.0.17': resolution: {integrity: sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/google@2.0.97': + resolution: {integrity: sha512-IGv9wGvbeuNBUVXzqwuOZTHXZUUEuO/aUKfSw2iv7smhalBC1FFuth5WLapJQHb1nusoDup5nELopzXV28vcxA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/google@3.0.123': + resolution: {integrity: sha512-5r6Ie37dBzJltNwA4WkJV5xDMv9ntJHYjxTgO/11TtOjY4jJJA721w8wdsFZcpkIhtA4rRvCw/S1VYbtdqNvbQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/mcp@1.0.81': + resolution: {integrity: sha512-jy9DkejXJXylaXb0m69Klqipny4FVABaCqzRgD4avLrikPj9Br0cIAS/QyB4mHdX37Bw05aaeBhaWRqzBHUtCg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai-compatible@1.0.19': resolution: {integrity: sha512-hnsqPCCSNKgpZRNDOAIXZs7OcUDM4ut5ggWxj2sjB4tNL/aBn/xrM7pJkqu+WuPowyrE60wPVSlw0LvtXAlMXQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai-compatible@1.0.54': + resolution: {integrity: sha512-3wY1L21FLhfKN6I1nQeWgFzDCeBiRxXwU2guE9BCixSLfOPtkJ0vyF7zo7lbnAg1y7tz6RDPq/o+AJf6QSL55g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai@2.0.42': resolution: {integrity: sha512-9mM6QS8k0ooH9qMC27nlrYLQmNDnO6Rk0JTmFo/yUxpABEWOcvQhMWNHbp9lFL6Ty5vkdINrujhsAQfWuEleOg==} engines: {node: '>=18'} @@ -931,6 +1036,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/openai@3.0.113': + resolution: {integrity: sha512-/T3z8ECzxfU5PqoC4i9/yzIqjQw2yRJOgeedGzBJ1RdFH9ZfL7TcDKStAiXJ5nZwFO50FUkqf6SgujhOrMGJKA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@2.2.8': resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} engines: {node: '>=18'} @@ -943,24 +1054,36 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.20': - resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} + '@ai-sdk/provider-utils@3.0.22': + resolution: {integrity: sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.22': - resolution: {integrity: sha512-fFT1KfUUKktfAFm5mClJhS1oux9tP2qgzmEZVl5UdwltQ1LO/s8hd7znVrgKzivwv1s1FIPza0s9OpJaNB/vHw==} + '@ai-sdk/provider-utils@3.0.37': + resolution: {integrity: sha512-mLx1SgE20xKQ87xME+9uG6pFlYPTqGDrMFrZ6XcytDnmbWGwmCIh2Xb9zFrfXUrKycSFRDet4Zovj388L9b1dg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.0': - resolution: {integrity: sha512-HyCyOls9I3a3e38+gtvOJOEjuw9KRcvbBnCL5GBuSmJvS9Jh9v3fz7pRC6ha1EUo/ZH1zwvLWYXBMtic8MTguA==} + '@ai-sdk/provider-utils@4.0.40': + resolution: {integrity: sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider-utils@4.0.51': + resolution: {integrity: sha512-ukLTs9x1Xm6lxSIwbJIxYQxbZHmVeIczNntARZrBcOa6pjdBhqeZnATNnJMHa7M9dZ8Ji5NJbpKpvz7o5XyBtg==} + engines: {node: '>=18.17'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@5.0.13': + resolution: {integrity: sha512-fScDJMDnTbx32kLDQqp0MvPjvwkgiwvlBxlmIg7XW5PbS91LG6JjH3PQG+34oMFglqfpQA355e24OdGj5PPoDw==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + '@ai-sdk/provider@1.1.3': resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} engines: {node: '>=18'} @@ -973,14 +1096,26 @@ packages: resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} engines: {node: '>=18'} - '@ai-sdk/provider@3.0.0': - resolution: {integrity: sha512-m9ka3ptkPQbaHHZHqDXDF9C9B5/Mav0KTdky1k2HZ3/nrW2t1AgObxIVPyGDWQNS9FXT/FS6PIoSjpcP/No8rQ==} + '@ai-sdk/provider@2.0.3': + resolution: {integrity: sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==} engines: {node: '>=18'} - '@ai-sdk/provider@3.0.5': - resolution: {integrity: sha512-2Xmoq6DBJqmSl80U6V9z5jJSJP7ehaJJQMy2iFUqTay06wdCqTnPVBBQbtEL8RCChenL+q5DC5H5WzU3vV3v8w==} + '@ai-sdk/provider@2.0.4': + resolution: {integrity: sha512-B0M50w0W43jTzZGyZrNwwaK1M79aKPw6PD/dQhkBR7vkR68yCINWBo2CbBLJrbrqYc46TaiSfsTiT+S9EmVl0w==} engines: {node: '>=18'} + '@ai-sdk/provider@3.0.14': + resolution: {integrity: sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==} + engines: {node: '>=18'} + + '@ai-sdk/provider@3.0.16': + resolution: {integrity: sha512-9Av6kg0t/IN/dcYAAmEJ4B9OPhcEJqwSR+GfHEA8olRkindXpUHadc3p3cyvgFUQFTVm1G5thtsmgZ9yVb2w3A==} + engines: {node: '>=18'} + + '@ai-sdk/provider@4.0.4': + resolution: {integrity: sha512-tbHKNLirllUNF3ZlkCsXnwab2ZV1Sl4b1H/Cp9ruCce15IBmskE8Gwkk0yo9xDWY+jho2of7lVXtwSsyrq7cwQ==} + engines: {node: '>=22'} + '@ai-sdk/react@1.2.12': resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} engines: {node: '>=18'} @@ -1029,6 +1164,9 @@ packages: resolution: {integrity: sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@antfu/install-pkg@2.1.0': + resolution: {integrity: sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==} + '@anthropic-ai/sdk@0.27.3': resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==} @@ -1040,12 +1178,6 @@ packages: resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} - '@apidevtools/json-schema-ref-parser@14.2.1': - resolution: {integrity: sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==} - engines: {node: '>= 20'} - peerDependencies: - '@types/json-schema': ^7.0.15 - '@asamuzakjp/css-color@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -1289,32 +1421,62 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} + '@babel/code-frame@8.0.0': + resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/compat-data@7.29.0': resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@8.0.5': + resolution: {integrity: sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/core@7.29.0': resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} + '@babel/core@8.0.5': + resolution: {integrity: sha512-2/oWkgTbBYoqioCWAE4XJobOrzwxTDa5/XjDP3tJ1BhDr/owcd9qnXBp4xc3/2G5X4bvXM04nrxbRJxFcXAxFQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} + '@babel/generator@8.0.5': + resolution: {integrity: sha512-f/TuhuMAxJqhwxEGNsJrswuG9VHmh0oNFoQoo6TbpgtFAz9wYZXcTAcWZMHfp7ljesr0RG04bp3Aos9GI59L7w==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@8.0.0': + resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@8.0.5': + resolution: {integrity: sha512-Qk8ahMGooH5mz6uuhoDvfZGkUf/Mf3RTBucVVl4MKx4LKMTv872TeW8O92h15iVtlN8wAROBIpI1aV6x1z0LCQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-create-class-features-plugin@7.28.6': resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-class-features-plugin@8.0.5': + resolution: {integrity: sha512-ckUE7tmolBbW4QV02lD874sWSPy8da2A09i/h0qS+IWolR+WiNhpq7C/rHZm00uOIkUb0Cp6+0Cy1ku/wj5uQQ==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-create-regexp-features-plugin@7.28.5': resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} @@ -1330,28 +1492,56 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@8.0.0': + resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-member-expression-to-functions@7.28.5': resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@8.0.5': + resolution: {integrity: sha512-GLe05QD98BkNFTkjaqeqF9QSRoHLKrrB4tpoplyQuuPrQJ72rtmkM4wvqJLX/sjZPqkbK5MUYSsuUTqdJoOVjA==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@8.0.0': + resolution: {integrity: sha512-NZ7mSS93o4ndX4KrbD7W8Sf3QT8Qe24PrnFyUcuOPDzK6faqDFKjY9RG7he7+I7FdiQ4llpnosFqzrXa+Vy3Ew==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@8.0.5': + resolution: {integrity: sha512-lUsSqMD0l5cJKl+3vlTV/hPDA/IvNkcHWVI3zFud2Vur+C9bCKdpqbpkN9eABembedbdWwF0qow6nbdIpNlpcw==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@8.0.0': + resolution: {integrity: sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@8.0.1': + resolution: {integrity: sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-remap-async-to-generator@7.27.1': resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} @@ -1364,22 +1554,44 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@8.0.1': + resolution: {integrity: sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + resolution: {integrity: sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@8.0.0': + resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-wrap-function@7.28.6': resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} @@ -1388,11 +1600,20 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} + '@babel/helpers@8.0.5': + resolution: {integrity: sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/parser@7.29.0': resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@8.0.5': + resolution: {integrity: sha512-51RXvQNFakaS0bTpYiGkxNbUVwkPO4kONv6EVLorZABxsx+KZ6Z7uSYvi/wmKS/+X+rfj9RvOw0/ZNh+cmI0Rw==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} @@ -1526,6 +1747,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@8.0.3': + resolution: {integrity: sha512-jmTPwps7oSQSZaV1SxkQ3C12UWyufGysGc5OzDpZzvPAIX4mO7dJT3hoqkWVrSImvkcMiknir1iLN1SNV/CZzg==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -1682,6 +1909,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@8.0.1': + resolution: {integrity: sha512-PMuzulWrrzFNmY3lXSk/tV9NRb7y0eZZLJY4UEo2TKszroxvUZHAPPi+T9FDyrQhod+TQA+t+8/QYaaMpiEuhA==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/plugin-transform-modules-systemjs@7.29.0': resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} @@ -1850,6 +2083,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@8.0.5': + resolution: {integrity: sha512-o6XW6OngFfpEQat3J1MxUDEd94Rjh80BZQqWmOXa9YTtoyDnk8Zim3NXcx3RTgGiOgkoayCMYp+Xk5NxEmzoMg==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/plugin-transform-unicode-escapes@7.27.1': resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} @@ -1897,6 +2136,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@8.0.1': + resolution: {integrity: sha512-qrPhQIN1NLrPmzgazF9XKQqXrOcp/WJly+K+6ReFonn24FZqRJO7clxOJo6Ni75L+2vAqI3cHVU2OJLBxoPp5A==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} @@ -1905,14 +2150,26 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} + '@babel/template@8.0.0': + resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} + '@babel/traverse@8.0.5': + resolution: {integrity: sha512-XFfnuvapSc/vJOcUO7kwORSvpBIvraofKEZ2dhT0PjiF21BRCD7YbAFC8UEeDJNeLoQz82/gVqzgX5hCzkCbdg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@8.0.5': + resolution: {integrity: sha512-eVdMqi3ej5aHhyQ2Si6yD2cAWeV8FJK9UrhK5aL0Sd8hu5GhT+YswhVNbVheOGVYMg8kuGuMaUpkB3stjj4z8A==} + engines: {node: ^22.18.0 || >=24.11.0} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1956,6 +2213,9 @@ packages: '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@braintree/sanitize-url@7.1.2': + resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true @@ -1984,49 +2244,147 @@ packages: '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} - '@clack/core@1.2.0': - resolution: {integrity: sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg==} + '@chevrotain/types@11.1.2': + resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + + '@clack/core@1.5.1': + resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==} + engines: {node: '>= 20.12.0'} - '@clack/prompts@1.2.0': - resolution: {integrity: sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w==} + '@clack/prompts@1.8.1': + resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==} + engines: {node: '>= 20.12.0'} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@copilotkit/react-core@1.10.6': - resolution: {integrity: sha512-sdojpntwgOxP8lWRzaFEiWr0g2wDefjQHtve5GPPie+otseFonV88FZjSqIq5LN+q5BIwDOEhCmDjALsGjXvuQ==} + '@copilotkit/a2ui-renderer@1.72.0': + resolution: {integrity: sha512-i+dNKpWp9E3UyhWqORTS9deOdloppse1jr7xVQnxiT1Loar2LOzAcqdGbqXHRUYORNs2DHRNHCtQZEaE0laX7g==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true - '@copilotkit/react-textarea@1.10.6': - resolution: {integrity: sha512-04totNGPtBkfVdYy5rCBqn47HDbdd9cqHk49At0CD9DFmGOaL7kwMbywHj4Dqq6UpDKuJqnS9aYyLI073vuZwA==} + '@copilotkit/channels-core@0.10.0': + resolution: {integrity: sha512-dmj1JDWzGR7TQu4TLKua/9qd6GaTjySppOQpGdkG+ake63Dwdw7yJn64iGXuYETsECk1jLsZWSF6R7qVvIfltg==} + peerDependencies: + vitest: ^4.0.0 + peerDependenciesMeta: + vitest: + optional: true + + '@copilotkit/channels-intelligence@0.10.0': + resolution: {integrity: sha512-Z1e+kdT9eB+nLNkPIpxL6MZ4Rnmp1abyOnBW6RwxuYF+B4wxcLAuBLpXPHQ0E72NxwVMbJ8qjwH8473rAm+LTQ==} + + '@copilotkit/channels-slack@0.10.0': + resolution: {integrity: sha512-zmojMtOwooAF3FVFQglYcq/icNZMdDpwk2HtBmFYZ2o44Sof77VQg7G3cdnb9UJuDyvOOMTSNRC2VOlXjXOK/g==} + + '@copilotkit/channels-teams@0.10.0': + resolution: {integrity: sha512-6CZ6wcnjZr/AB2zMOJUVzrjixLeUGQ6GSOaXMwWrBrR3Ik3dIMzUaNeIMFLuKE7cCUb30v0DUetDpNHsP1WNBQ==} + peerDependencies: + '@microsoft/agents-activity': ^1.5.3 + '@microsoft/agents-hosting': ^1.5.3 + express: ^4.21.2 || ^5.0.0 + peerDependenciesMeta: + '@microsoft/agents-activity': + optional: true + '@microsoft/agents-hosting': + optional: true + express: + optional: true + + '@copilotkit/channels-ui@0.10.0': + resolution: {integrity: sha512-SpldPYXtP6j+n70srKlYYCHsyZsOt8Frr7RcnwRjFwmaqukPlOqc4AVg0UM8lxRmlascN679a4fQyg5Hxr2NEw==} + + '@copilotkit/core@1.72.0': + resolution: {integrity: sha512-0kTTakTO20ZXwQu+YYxbwQoVA6QgDqKyl2vECDcGuX3etEGYGCKgrKf4r0aKc3WxeCiuvhwutXfPPxnCCC0sIA==} + engines: {node: '>=20'} + + '@copilotkit/license-verifier@0.5.0': + resolution: {integrity: sha512-vrwKtIpYwF0FT9ZoYASH8owa2cGV0dhDvJGaCRaRMStwDxpc6DRdydKkhx8cWZXyBRxEYcq/Vygv4JvevhQQdQ==} + + '@copilotkit/mcp-apps-renderer@1.72.0': + resolution: {integrity: sha512-gM6wK88doMybljXQPz3T4IbmyV/N6+wWukNAS+lOabo2L2ROHn2MevDTdAX1MNx7/HJ2PrcwpU3IDuGNk+ITQA==} + peerDependencies: + '@ag-ui/client': 0.0.59 + zod: '>=3.25' + + '@copilotkit/react-core@1.72.0': + resolution: {integrity: sha512-TFQx5kk64gY2qIhaC7qrcMbnSRmS2+mKlQ7Yp63lFiSbBENwcmPxx6GvphvkolwrpwzC/wBY1xNGe6OHs68C4g==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + zod: '>=3.25' - '@copilotkit/react-ui@1.10.6': - resolution: {integrity: sha512-eNIbZKMvBVZqlAR4fqkmZRIYIt8WhwZOxfVJVwMD9nfmWdtatmxrOLecyDiPk/hkq2o/8s2/rubaZSMK6m+GHQ==} + '@copilotkit/react-textarea@1.72.0': + resolution: {integrity: sha512-YKkZWkGBO1mEwpAj0UzzvfTw+8JuWJDr6luiXyl2XIUZxDqsK4Nme1Bbaw1nVQGNZ0QXjU6FTxiGvck+si/tBQ==} peerDependencies: react: 19.2.4 + react-dom: 19.2.4 - '@copilotkit/runtime-client-gql@1.10.6': - resolution: {integrity: sha512-oLX8mjppVvQCWfquW9A0500hYVNxM4X/mtt76SEvfGUb2KsNQ4j2HOCzpmtm85MeLproC+f9738wLwRueLliZg==} + '@copilotkit/react-ui@1.72.0': + resolution: {integrity: sha512-nCVAr2E8evnOvB6XXN7WKWBDgsYn07iWjuuI1h7U3zfdlS/d/oz3vob7w6Uq987lEGxWEmUf8KNuCj6kGFQZpg==} peerDependencies: react: 19.2.4 - '@copilotkit/runtime@1.10.6': - resolution: {integrity: sha512-35MdJ6nutC+spgHRJURbanLxBoQCNvVBYD0CBIk4Rv3/Ck8XgZA4lcc+5aGteuERXOPBsYEQjGD4xEPy3QXmGg==} + '@copilotkit/runtime-client-gql@1.72.0': + resolution: {integrity: sha512-ThXg3l+u71tt9l30f1cXaMLtJbKyDCeKDJ/zKpiLHnbemBxF7I0Ms9bjEYF2iCDviYTlQQ/8QUlfAjuq/Ohrww==} peerDependencies: - '@ag-ui/client': '>=0.0.39' - '@ag-ui/core': '>=0.0.39' - '@ag-ui/encoder': '>=0.0.39' - '@ag-ui/langgraph': '>=0.0.18' - '@ag-ui/proto': '>=0.0.39' + react: 19.2.4 - '@copilotkit/shared@1.10.6': - resolution: {integrity: sha512-56Rltf4fDBqCpl1ZXARypt5NdE4LTg3tGPPLurZpgPmm31Lv5EAHpfjC7I55vt9A0mXWlTCHtCrpiaAlTyzGJw==} + '@copilotkit/runtime@1.72.0': + resolution: {integrity: sha512-XTler40g1iONbr5euHkB5t3e6A/MzPKb26KHlyl220fb6mzgDUk0fBUfwlsBpXw/g8AXY1LiPGIP0+0eXQ7GUg==} + engines: {node: '>=20'} + peerDependencies: + '@anthropic-ai/sdk': '>=0.57.0' + '@langchain/aws': '>=0.1.9' + '@langchain/community': '>=0.3.58' + '@langchain/core': '>=0.3.66' + '@langchain/google-gauth': '>=0.1.0' + '@langchain/langgraph-sdk': '>=0.1.2' + '@langchain/openai': '>=0.4.2' + groq-sdk: '>=0.3.0 <1.0.0' + langchain: '>=0.3.3' + openai: ^4.85.1 || >=5.0.0 + peerDependenciesMeta: + '@anthropic-ai/sdk': + optional: true + '@langchain/aws': + optional: true + '@langchain/community': + optional: true + '@langchain/google-gauth': + optional: true + '@langchain/langgraph-sdk': + optional: true + '@langchain/openai': + optional: true + groq-sdk: + optional: true + langchain: + optional: true + openai: + optional: true + + '@copilotkit/shared@1.72.0': + resolution: {integrity: sha512-lqt2V2P063vEfb9xGIX4JWnuyNRJHz3MAUgwfTLpdpHU7k1nNcStbWlUCZUc7oSxLXaZ+cGj1Ncx/jcgNd7FFQ==} + peerDependencies: + '@ag-ui/core': '>=0.0.48' + + '@copilotkit/web-components@1.72.0': + resolution: {integrity: sha512-4pdhsZj3f3LJoTCJIc7MPJihKDFm/R9GhYVmdRGzWU5iQKKdQDdVg4Z7PZm7Y+hZ51ud1hCtmIwFKZFBmy8GAg==} + engines: {node: '>=20'} + peerDependencies: + lit: ^3.3.2 + + '@copilotkit/web-inspector@1.72.0': + resolution: {integrity: sha512-l+739387Gef/lbpj8Kf8G90+VYUKgTFsBTtWy4bqiGNBAFbRcerwNRx+C1xackFCmQCR/7TzBBy6HvzsgDLQHw==} + engines: {node: '>=20'} '@crxjs/vite-plugin@2.7.1': resolution: {integrity: sha512-mn77Lc1ilIvbO7ZqijjNy+AnRgc8srkfHOtV6HrGrYZgRe8YI3aIcSjHJCU5Kq75SejEZGrdAoHdn3gBGeKpEA==} @@ -2083,9 +2441,6 @@ packages: resolution: {integrity: sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==} engines: {node: '>= 6'} - '@datastructures-js/deque@1.0.8': - resolution: {integrity: sha512-PSBhJ2/SmeRPRHuBv7i/fHWIdSC3JTyq56qb+Rq0wjOagi0/fdV5/B/3Md5zFZus/W6OkSPMaxMKKMNMrSmubg==} - '@dub/analytics@0.0.32': resolution: {integrity: sha512-jmZrgbArOX08/kz+hi1s9ggt0k64WzRErt6jM6TfuqUHlXQYNNNRcefvKrmd9vwmbvNGR/GxZnYeyco6Zyw4fg==} @@ -2185,8 +2540,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -2203,8 +2558,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -2221,8 +2576,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2239,8 +2594,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2257,8 +2612,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2275,8 +2630,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2293,8 +2648,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2311,8 +2666,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2329,8 +2684,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2347,8 +2702,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2365,8 +2720,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2383,8 +2738,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -2401,8 +2756,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -2419,8 +2774,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -2437,8 +2792,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -2455,8 +2810,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -2473,8 +2828,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -2491,8 +2846,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -2509,8 +2864,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -2527,8 +2882,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -2545,8 +2900,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -2563,8 +2918,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -2581,8 +2936,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2599,8 +2954,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2617,8 +2972,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2635,8 +2990,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2683,6 +3038,10 @@ packages: '@expo/sudo-prompt@9.3.2': resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@fastify/busboy@3.2.0': resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} @@ -2815,6 +3174,13 @@ packages: peerDependencies: hono: ^4 + '@hono/node-ws@1.3.1': + resolution: {integrity: sha512-vo/MwCnpJAVHBkGzWjCJ28wF45fYHAfbPZcH2rodZODHtch2GHA94KtMfusmVycTUtsLAsaNsHhtY6P8X3RQsA==} + engines: {node: '>=18.14.1'} + peerDependencies: + '@hono/node-server': ^1.19.11 + hono: ^4.6.0 + '@hookform/resolvers@3.10.0': resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} peerDependencies: @@ -2837,6 +3203,12 @@ packages: resolution: {integrity: sha512-farwTW1ffFt3NVvqZQIcd0VBKByLK6ctnfn4XM7Rf9Mf5JJbNwVPV1Wll046E/MlKAaZEM6sFDGAh+JCnnmqyQ==} engines: {node: '>=20.0.0'} + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.1.7': + resolution: {integrity: sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==} + '@img/colour@1.1.0': resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} @@ -3254,8 +3626,8 @@ packages: resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} engines: {node: '>=12'} - '@isaacs/ttlcache@2.1.4': - resolution: {integrity: sha512-7kMz0BJpMvgAMkyglums7B2vtrn5g0a0am77JY0GjkZZNetOBCFn7AG7gKCwT0QPiXyxW7YIQSgtARknUEOcxQ==} + '@isaacs/ttlcache@2.1.5': + resolution: {integrity: sha512-VwGZqqjAWPICTmxUZnbpEfO60LhPWzquik+bmyXGY7pYRn6diEvCI5i6Ca+J6o2y4vS73HrpuMTo2dOvUevH8w==} engines: {node: '>=12'} '@istanbuljs/load-nyc-config@1.1.0': @@ -3336,9 +3708,15 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jetbrains/websandbox@1.4.1': + resolution: {integrity: sha512-7FcQ9flzW0H+AjLlCRdhAE47zZxLtCwEcZjHvxtNLa0LbKMwEBBp0cQIaJ3vowCoUh6wqmSUXUCMtQzdv/SpLg==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.4.0-beta.0': + resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -3352,6 +3730,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -3536,136 +3917,131 @@ packages: typeorm: optional: true - '@langchain/community@0.3.59': - resolution: {integrity: sha512-lYoVFC9wArWMXaixDgIadTE22jk4ZYAvSHHmwaMRagkGr5f4kyqMeJ83UUeW76XPx2cBy2fRSO+acSgqSuWE6A==} - engines: {node: '>=18'} + '@langchain/community@1.1.27': + resolution: {integrity: sha512-s2U3w7QV7QpkFtY1eZMni4poz+nKLFclpDi3a7hUbZ67ttsGaU9WkZ2BiLuzLIs+IFaUvON/KcGkE8EqAl9aPA==} + engines: {node: '>=20'} deprecated: This package has been deprecated. See https://github.com/langchain-ai/langchainjs-community/issues/61 for more info peerDependencies: - '@arcjet/redact': ^v1.0.0-alpha.23 + '@arcjet/redact': ^v1.2.0 '@aws-crypto/sha256-js': ^5.0.0 - '@aws-sdk/client-bedrock-agent-runtime': ^3.749.0 - '@aws-sdk/client-bedrock-runtime': ^3.749.0 - '@aws-sdk/client-dynamodb': ^3.749.0 - '@aws-sdk/client-kendra': ^3.749.0 - '@aws-sdk/client-lambda': ^3.749.0 - '@aws-sdk/client-s3': ^3.749.0 - '@aws-sdk/client-sagemaker-runtime': ^3.749.0 - '@aws-sdk/client-sfn': ^3.749.0 + '@aws-sdk/client-dynamodb': ^3.1001.0 + '@aws-sdk/client-lambda': ^3.1001.0 + '@aws-sdk/client-s3': ^3.1001.0 + '@aws-sdk/client-sagemaker-runtime': ^3.1001.0 + '@aws-sdk/client-sfn': ^3.1001.0 '@aws-sdk/credential-provider-node': ^3.388.0 '@aws-sdk/dsql-signer': '*' - '@azure/search-documents': ^12.0.0 - '@azure/storage-blob': ^12.15.0 + '@azure/search-documents': ^12.2.0 + '@azure/storage-blob': ^12.31.0 '@browserbasehq/sdk': '*' '@browserbasehq/stagehand': ^1.0.0 '@clickhouse/client': ^0.2.5 - '@cloudflare/ai': '*' '@datastax/astra-db-ts': ^1.0.0 '@elastic/elasticsearch': ^8.4.0 '@getmetal/metal-sdk': '*' '@getzep/zep-cloud': ^1.0.6 - '@getzep/zep-js': ^0.9.0 - '@gomomento/sdk': ^1.51.1 - '@gomomento/sdk-core': ^1.51.1 - '@google-ai/generativelanguage': '*' + '@getzep/zep-js': ^2.0.2 + '@gomomento/sdk-core': ^1.117.2 '@google-cloud/storage': ^6.10.1 || ^7.7.0 '@gradientai/nodejs-sdk': ^1.2.0 - '@huggingface/inference': ^4.0.5 - '@huggingface/transformers': ^3.5.2 + '@huggingface/inference': ^4.13.14 + '@huggingface/transformers': ^3.8.1 '@ibm-cloud/watsonx-ai': '*' '@lancedb/lancedb': ^0.19.1 - '@langchain/core': '>=0.3.58 <0.4.0' + '@langchain/core': ^1.1.38 '@layerup/layerup-security': ^1.5.12 - '@libsql/client': ^0.14.0 - '@mendable/firecrawl-js': ^1.4.3 + '@libsql/client': ^0.17.0 + '@mendable/firecrawl-js': ^4.15.2 '@mlc-ai/web-llm': '*' '@mozilla/readability': '*' '@neondatabase/serverless': '*' - '@notionhq/client': ^2.2.10 + '@notionhq/client': ^5.11.1 '@opensearch-project/opensearch': '*' '@pinecone-database/pinecone': '*' '@planetscale/database': ^1.8.0 '@premai/prem-sdk': ^0.3.25 - '@qdrant/js-client-rest': ^1.15.0 + '@qdrant/js-client-rest': '*' '@raycast/api': ^1.55.2 '@rockset/client': ^0.9.1 - '@smithy/eventstream-codec': ^2.0.5 - '@smithy/protocol-http': ^3.0.6 - '@smithy/signature-v4': ^2.0.10 - '@smithy/util-utf8': ^2.0.0 - '@spider-cloud/spider-client': ^0.0.21 + '@smithy/eventstream-codec': ^4.2.10 + '@smithy/protocol-http': ^5.3.10 + '@smithy/signature-v4': ^5.3.10 + '@smithy/util-utf8': ^4.2.2 + '@spider-cloud/spider-client': ^0.2.0 '@supabase/supabase-js': ^2.45.0 '@tensorflow-models/universal-sentence-encoder': '*' - '@tensorflow/tfjs-converter': '*' '@tensorflow/tfjs-core': '*' '@upstash/ratelimit': ^1.1.3 || ^2.0.3 '@upstash/redis': ^1.20.6 '@upstash/vector': ^1.1.1 '@vercel/kv': '*' '@vercel/postgres': '*' - '@writerai/writer-sdk': ^0.40.2 - '@xata.io/client': ^0.28.0 + '@writerai/writer-sdk': ^3.6.0 + '@xata.io/client': ^0.30.1 + '@xenova/transformers': '*' '@zilliz/milvus2-sdk-node': '>=2.3.5' - apify-client: ^2.7.1 - assemblyai: ^4.6.0 - azion: ^1.11.1 - better-sqlite3: '>=9.4.0 <12.0.0' + apify-client: ^2.22.2 + assemblyai: ^4.25.1 + azion: ^3.1.2 + better-sqlite3: '>=9.4.0 <13.0.0' cassandra-driver: ^4.7.2 - cborg: ^4.1.1 - cheerio: ^1.0.0-rc.12 + cborg: ^4.5.8 + cheerio: ^1.2.0 chromadb: '*' closevector-common: 0.1.3 closevector-node: 0.1.6 closevector-web: 0.1.6 cohere-ai: '*' - convex: ^1.3.1 + convex: ^1.32.0 + couchbase: ^4.6.1 crypto-js: ^4.2.0 - d3-dsv: ^2.0.0 - discord.js: ^14.14.1 + d3-dsv: ^3.0.1 + discord.js: ^14.25.1 duck-duck-scrape: ^2.2.5 epub2: ^3.0.1 + faiss-node: '*' fast-xml-parser: '*' - firebase-admin: ^11.9.0 || ^12.0.0 || ^13.0.0 + firebase-admin: ^13.6.1 google-auth-library: '*' googleapis: '*' hnswlib-node: ^3.0.0 html-to-text: ^9.0.5 ibm-cloud-sdk-core: '*' - ignore: ^5.2.0 - interface-datastore: ^8.2.11 + ignore: ^7.0.5 + interface-datastore: ^9.0.2 ioredis: ^5.3.2 it-all: ^3.0.4 jsdom: '*' - jsonwebtoken: ^9.0.2 - llmonitor: ^0.5.9 - lodash: ^4.17.21 + jsonwebtoken: ^9.0.3 + lodash: ^4.17.23 lunary: ^0.7.10 - mammoth: ^1.6.0 - mariadb: ^3.4.0 - mem0ai: ^2.1.8 - mongodb: ^6.17.0 - mysql2: ^3.9.8 + mammoth: ^1.11.0 + mariadb: ^3.5.1 + mem0ai: ^2.2.4 + mongodb: '*' + mysql2: ^3.19.1 neo4j-driver: '*' + node-llama-cpp: '>=3.0.0' notion-to-md: ^3.1.0 - officeparser: ^4.0.4 + officeparser: ^6.0.4 openai: '*' - pdf-parse: 1.1.1 + pdf-parse: 2.4.5 pg: ^8.11.0 - pg-copy-streams: ^6.0.5 + pg-copy-streams: ^7.0.0 pickleparser: ^0.2.1 - playwright: ^1.32.1 - portkey-ai: ^0.1.11 + playwright: ^1.58.2 + portkey-ai: ^3.0.3 puppeteer: '*' pyodide: '>=0.24.1 <0.27.0' redis: '*' replicate: '*' sonix-speech-recognition: ^2.1.1 srt-parser-2: ^1.2.3 - typeorm: ^0.3.20 - typesense: ^1.5.3 + typeorm: ^0.3.28 + typesense: ^3.0.1 usearch: ^1.1.1 - voy-search: 0.6.2 - weaviate-client: ^3.5.2 - web-auth-library: ^1.0.3 + voy-search: 0.6.3 + weaviate-client: '*' word-extractor: '*' ws: ^8.14.2 youtubei.js: '*' @@ -3674,14 +4050,8 @@ packages: optional: true '@aws-crypto/sha256-js': optional: true - '@aws-sdk/client-bedrock-agent-runtime': - optional: true - '@aws-sdk/client-bedrock-runtime': - optional: true '@aws-sdk/client-dynamodb': optional: true - '@aws-sdk/client-kendra': - optional: true '@aws-sdk/client-lambda': optional: true '@aws-sdk/client-s3': @@ -3702,8 +4072,6 @@ packages: optional: true '@clickhouse/client': optional: true - '@cloudflare/ai': - optional: true '@datastax/astra-db-ts': optional: true '@elastic/elasticsearch': @@ -3714,12 +4082,8 @@ packages: optional: true '@getzep/zep-js': optional: true - '@gomomento/sdk': - optional: true '@gomomento/sdk-core': optional: true - '@google-ai/generativelanguage': - optional: true '@google-cloud/storage': optional: true '@gradientai/nodejs-sdk': @@ -3772,8 +4136,6 @@ packages: optional: true '@tensorflow-models/universal-sentence-encoder': optional: true - '@tensorflow/tfjs-converter': - optional: true '@tensorflow/tfjs-core': optional: true '@upstash/ratelimit': @@ -3790,6 +4152,8 @@ packages: optional: true '@xata.io/client': optional: true + '@xenova/transformers': + optional: true '@zilliz/milvus2-sdk-node': optional: true apify-client: @@ -3818,6 +4182,8 @@ packages: optional: true convex: optional: true + couchbase: + optional: true crypto-js: optional: true d3-dsv: @@ -3828,6 +4194,8 @@ packages: optional: true epub2: optional: true + faiss-node: + optional: true fast-xml-parser: optional: true firebase-admin: @@ -3852,8 +4220,6 @@ packages: optional: true jsonwebtoken: optional: true - llmonitor: - optional: true lodash: optional: true lunary: @@ -3869,374 +4235,8 @@ packages: mysql2: optional: true neo4j-driver: - optional: true - notion-to-md: - optional: true - officeparser: - optional: true - pdf-parse: - optional: true - pg: - optional: true - pg-copy-streams: - optional: true - pickleparser: - optional: true - playwright: - optional: true - portkey-ai: - optional: true - puppeteer: - optional: true - pyodide: - optional: true - redis: - optional: true - replicate: - optional: true - sonix-speech-recognition: - optional: true - srt-parser-2: - optional: true - typeorm: - optional: true - typesense: - optional: true - usearch: - optional: true - voy-search: - optional: true - weaviate-client: - optional: true - web-auth-library: - optional: true - word-extractor: - optional: true - ws: - optional: true - youtubei.js: - optional: true - - '@langchain/community@1.1.27': - resolution: {integrity: sha512-s2U3w7QV7QpkFtY1eZMni4poz+nKLFclpDi3a7hUbZ67ttsGaU9WkZ2BiLuzLIs+IFaUvON/KcGkE8EqAl9aPA==} - engines: {node: '>=20'} - deprecated: This package has been deprecated. See https://github.com/langchain-ai/langchainjs-community/issues/61 for more info - peerDependencies: - '@arcjet/redact': ^v1.2.0 - '@aws-crypto/sha256-js': ^5.0.0 - '@aws-sdk/client-dynamodb': ^3.1001.0 - '@aws-sdk/client-lambda': ^3.1001.0 - '@aws-sdk/client-s3': ^3.1001.0 - '@aws-sdk/client-sagemaker-runtime': ^3.1001.0 - '@aws-sdk/client-sfn': ^3.1001.0 - '@aws-sdk/credential-provider-node': ^3.388.0 - '@aws-sdk/dsql-signer': '*' - '@azure/search-documents': ^12.2.0 - '@azure/storage-blob': ^12.31.0 - '@browserbasehq/sdk': '*' - '@browserbasehq/stagehand': ^1.0.0 - '@clickhouse/client': ^0.2.5 - '@datastax/astra-db-ts': ^1.0.0 - '@elastic/elasticsearch': ^8.4.0 - '@getmetal/metal-sdk': '*' - '@getzep/zep-cloud': ^1.0.6 - '@getzep/zep-js': ^2.0.2 - '@gomomento/sdk-core': ^1.117.2 - '@google-cloud/storage': ^6.10.1 || ^7.7.0 - '@gradientai/nodejs-sdk': ^1.2.0 - '@huggingface/inference': ^4.13.14 - '@huggingface/transformers': ^3.8.1 - '@ibm-cloud/watsonx-ai': '*' - '@lancedb/lancedb': ^0.19.1 - '@langchain/core': ^1.1.38 - '@layerup/layerup-security': ^1.5.12 - '@libsql/client': ^0.17.0 - '@mendable/firecrawl-js': ^4.15.2 - '@mlc-ai/web-llm': '*' - '@mozilla/readability': '*' - '@neondatabase/serverless': '*' - '@notionhq/client': ^5.11.1 - '@opensearch-project/opensearch': '*' - '@pinecone-database/pinecone': '*' - '@planetscale/database': ^1.8.0 - '@premai/prem-sdk': ^0.3.25 - '@qdrant/js-client-rest': '*' - '@raycast/api': ^1.55.2 - '@rockset/client': ^0.9.1 - '@smithy/eventstream-codec': ^4.2.10 - '@smithy/protocol-http': ^5.3.10 - '@smithy/signature-v4': ^5.3.10 - '@smithy/util-utf8': ^4.2.2 - '@spider-cloud/spider-client': ^0.2.0 - '@supabase/supabase-js': ^2.45.0 - '@tensorflow-models/universal-sentence-encoder': '*' - '@tensorflow/tfjs-core': '*' - '@upstash/ratelimit': ^1.1.3 || ^2.0.3 - '@upstash/redis': ^1.20.6 - '@upstash/vector': ^1.1.1 - '@vercel/kv': '*' - '@vercel/postgres': '*' - '@writerai/writer-sdk': ^3.6.0 - '@xata.io/client': ^0.30.1 - '@xenova/transformers': '*' - '@zilliz/milvus2-sdk-node': '>=2.3.5' - apify-client: ^2.22.2 - assemblyai: ^4.25.1 - azion: ^3.1.2 - better-sqlite3: '>=9.4.0 <13.0.0' - cassandra-driver: ^4.7.2 - cborg: ^4.5.8 - cheerio: ^1.2.0 - chromadb: '*' - closevector-common: 0.1.3 - closevector-node: 0.1.6 - closevector-web: 0.1.6 - cohere-ai: '*' - convex: ^1.32.0 - couchbase: ^4.6.1 - crypto-js: ^4.2.0 - d3-dsv: ^3.0.1 - discord.js: ^14.25.1 - duck-duck-scrape: ^2.2.5 - epub2: ^3.0.1 - faiss-node: '*' - fast-xml-parser: '*' - firebase-admin: ^13.6.1 - google-auth-library: '*' - googleapis: '*' - hnswlib-node: ^3.0.0 - html-to-text: ^9.0.5 - ibm-cloud-sdk-core: '*' - ignore: ^7.0.5 - interface-datastore: ^9.0.2 - ioredis: ^5.3.2 - it-all: ^3.0.4 - jsdom: '*' - jsonwebtoken: ^9.0.3 - lodash: ^4.17.23 - lunary: ^0.7.10 - mammoth: ^1.11.0 - mariadb: ^3.5.1 - mem0ai: ^2.2.4 - mongodb: '*' - mysql2: ^3.19.1 - neo4j-driver: '*' - node-llama-cpp: '>=3.0.0' - notion-to-md: ^3.1.0 - officeparser: ^6.0.4 - openai: '*' - pdf-parse: 2.4.5 - pg: ^8.11.0 - pg-copy-streams: ^7.0.0 - pickleparser: ^0.2.1 - playwright: ^1.58.2 - portkey-ai: ^3.0.3 - puppeteer: '*' - pyodide: '>=0.24.1 <0.27.0' - redis: '*' - replicate: '*' - sonix-speech-recognition: ^2.1.1 - srt-parser-2: ^1.2.3 - typeorm: ^0.3.28 - typesense: ^3.0.1 - usearch: ^1.1.1 - voy-search: 0.6.3 - weaviate-client: '*' - word-extractor: '*' - ws: ^8.14.2 - youtubei.js: '*' - peerDependenciesMeta: - '@arcjet/redact': - optional: true - '@aws-crypto/sha256-js': - optional: true - '@aws-sdk/client-dynamodb': - optional: true - '@aws-sdk/client-lambda': - optional: true - '@aws-sdk/client-s3': - optional: true - '@aws-sdk/client-sagemaker-runtime': - optional: true - '@aws-sdk/client-sfn': - optional: true - '@aws-sdk/credential-provider-node': - optional: true - '@aws-sdk/dsql-signer': - optional: true - '@azure/search-documents': - optional: true - '@azure/storage-blob': - optional: true - '@browserbasehq/sdk': - optional: true - '@clickhouse/client': - optional: true - '@datastax/astra-db-ts': - optional: true - '@elastic/elasticsearch': - optional: true - '@getmetal/metal-sdk': - optional: true - '@getzep/zep-cloud': - optional: true - '@getzep/zep-js': - optional: true - '@gomomento/sdk-core': - optional: true - '@google-cloud/storage': - optional: true - '@gradientai/nodejs-sdk': - optional: true - '@huggingface/inference': - optional: true - '@huggingface/transformers': - optional: true - '@lancedb/lancedb': - optional: true - '@layerup/layerup-security': - optional: true - '@libsql/client': - optional: true - '@mendable/firecrawl-js': - optional: true - '@mlc-ai/web-llm': - optional: true - '@mozilla/readability': - optional: true - '@neondatabase/serverless': - optional: true - '@notionhq/client': - optional: true - '@opensearch-project/opensearch': - optional: true - '@pinecone-database/pinecone': - optional: true - '@planetscale/database': - optional: true - '@premai/prem-sdk': - optional: true - '@qdrant/js-client-rest': - optional: true - '@raycast/api': - optional: true - '@rockset/client': - optional: true - '@smithy/eventstream-codec': - optional: true - '@smithy/protocol-http': - optional: true - '@smithy/signature-v4': - optional: true - '@smithy/util-utf8': - optional: true - '@spider-cloud/spider-client': - optional: true - '@supabase/supabase-js': - optional: true - '@tensorflow-models/universal-sentence-encoder': - optional: true - '@tensorflow/tfjs-core': - optional: true - '@upstash/ratelimit': - optional: true - '@upstash/redis': - optional: true - '@upstash/vector': - optional: true - '@vercel/kv': - optional: true - '@vercel/postgres': - optional: true - '@writerai/writer-sdk': - optional: true - '@xata.io/client': - optional: true - '@xenova/transformers': - optional: true - '@zilliz/milvus2-sdk-node': - optional: true - apify-client: - optional: true - assemblyai: - optional: true - azion: - optional: true - better-sqlite3: - optional: true - cassandra-driver: - optional: true - cborg: - optional: true - cheerio: - optional: true - chromadb: - optional: true - closevector-common: - optional: true - closevector-node: - optional: true - closevector-web: - optional: true - cohere-ai: - optional: true - convex: - optional: true - couchbase: - optional: true - crypto-js: - optional: true - d3-dsv: - optional: true - discord.js: - optional: true - duck-duck-scrape: - optional: true - epub2: - optional: true - faiss-node: - optional: true - fast-xml-parser: - optional: true - firebase-admin: - optional: true - google-auth-library: - optional: true - googleapis: - optional: true - hnswlib-node: - optional: true - html-to-text: - optional: true - ignore: - optional: true - interface-datastore: - optional: true - ioredis: - optional: true - it-all: - optional: true - jsdom: - optional: true - jsonwebtoken: - optional: true - lodash: - optional: true - lunary: - optional: true - mammoth: - optional: true - mariadb: - optional: true - mem0ai: - optional: true - mongodb: - optional: true - mysql2: - optional: true - neo4j-driver: - optional: true - node-llama-cpp: + optional: true + node-llama-cpp: optional: true notion-to-md: optional: true @@ -4283,14 +4283,14 @@ packages: youtubei.js: optional: true - '@langchain/core@0.3.80': - resolution: {integrity: sha512-vcJDV2vk1AlCwSh3aBm/urQ1ZrlXFFBocv11bz/NBUfLWD5/UDNMzwPdaAd2dKvNmTWa9FM2lirLU3+JCf4cRA==} - engines: {node: '>=18'} - '@langchain/core@1.1.39': resolution: {integrity: sha512-DP9c7TREy6iA7HnywstmUAsNyJNYTFpRg2yBfQ+6H0l1HnvQzei9GsQ36GeOLxgRaD3vm9K8urCcawSC7yQpCw==} engines: {node: '>=20'} + '@langchain/core@1.2.11': + resolution: {integrity: sha512-8yuWLLloTSYA453akm2JSadOVa8kGDY8v+kTzQ6kTY6aIETTEIxgysjZWyKrWQLo3UazctsSoGJ8JrdCGFL4/w==} + engines: {node: '>=20'} + '@langchain/google-common@0.1.8': resolution: {integrity: sha512-8auqWw2PMPhcHQHS+nMN3tVZrUPgSLckUaFeOHDOeSBiDvBd4KCybPwyl2oCwMDGvmyIxvOOckkMdeGaJ92vpQ==} engines: {node: '>=18'} @@ -4309,26 +4309,19 @@ packages: peerDependencies: '@langchain/core': ^1.0.1 - '@langchain/langgraph-sdk@0.0.70': - resolution: {integrity: sha512-O8I12bfeMVz5fOrXnIcK4IdRf50IqyJTO458V56wAIHLNoi4H8/JHM+2M+Y4H2PtslXIGnvomWqlBd0eY5z/Og==} + '@langchain/langgraph-checkpoint@1.1.5': + resolution: {integrity: sha512-BwDwl5VeTOh6CVuiIPgsUgfK51vTJDMSbFcSCUfjJWsl8/DPdK/mbv+ejxJstkSk/BlSPMP4JfXWcN6jD2ea2Q==} + engines: {node: '>=18'} peerDependencies: - '@langchain/core': '>=0.2.31 <0.4.0' - react: 19.2.4 - peerDependenciesMeta: - '@langchain/core': - optional: true - react: - optional: true + '@langchain/core': ^1.1.48 - '@langchain/langgraph-sdk@0.1.10': - resolution: {integrity: sha512-9srSCb2bSvcvehMgjA2sMMwX0o1VUgPN6ghwm5Fwc9JGAKsQa6n1S4eCwy1h4abuYxwajH5n3spBw+4I2WYbgw==} + '@langchain/langgraph-sdk@1.11.0': + resolution: {integrity: sha512-Gk6mrCs2fbqKr3luQxVM5ZEcpjK35QO5w/Tr9h/RQPzeKqrsHyPrP4NR9udfgy1ycu7KvvoZ3V0t3beN/edx0g==} peerDependencies: - '@langchain/core': '>=0.2.31 <0.4.0 || ^1.0.0-alpha' + '@langchain/core': ^1.1.48 react: 19.2.4 react-dom: 19.2.4 peerDependenciesMeta: - '@langchain/core': - optional: true react: optional: true react-dom: @@ -4365,17 +4358,12 @@ packages: zod-to-json-schema: optional: true - '@langchain/openai@0.4.9': - resolution: {integrity: sha512-NAsaionRHNdqaMjVLPkFCyjUDze+OqRHghA1Cn4fPoAafz+FXcl9c7LlEl9Xo0FH6/8yiCl7Rw2t780C/SBVxQ==} + '@langchain/langgraph@1.4.15': + resolution: {integrity: sha512-QG8led1xbFfgikAIF9E5G1Kp1KLtq/xv7YASWy+wnPftQw0Hxu0kpPXl0Q1U2Dfpwb8w/Vfz0QarUR8eI/xtRw==} engines: {node: '>=18'} peerDependencies: - '@langchain/core': '>=0.3.39 <0.4.0' - - '@langchain/openai@0.5.18': - resolution: {integrity: sha512-CX1kOTbT5xVFNdtLjnM0GIYNf+P7oMSu+dGCFxxWRa3dZwWiuyuBXCm+dToUGxDLnsHuV1bKBtIzrY1mLq/A1Q==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.3.58 <0.4.0' + '@langchain/core': ^1.1.48 + zod: ^3.25.32 || ^4.2.0 '@langchain/openai@1.4.1': resolution: {integrity: sha512-jaHk4TnLqWrQ1KYmavvwCImW6x8pBy6LLTK73tzSMg7HBLbq0g/l7EkpMcxZWDOvyufuCXUqO2bj47apcOhw6Q==} @@ -4389,30 +4377,21 @@ packages: peerDependencies: '@langchain/core': ^1.1.39 + '@langchain/protocol@0.0.19': + resolution: {integrity: sha512-9hKcRrH7cBX6gfutdfXPoft1OCchHe4FEpALoDJMl5Qu+n/YG5ynZmyu8+8cxORlPwHBoKTxggvXz+76M1yX1Q==} + '@langchain/tavily@1.2.0': resolution: {integrity: sha512-aPLPgtw8+b/Rnr3H+X8H8z98T/Y7JuCE4B5eqRDHoEWgZvMDUFF7divqwQqCTMq2deQttlVrm5bN5JbKaAR7/w==} engines: {node: '>=20'} peerDependencies: '@langchain/core': ^1.0.0 - '@langchain/textsplitters@0.1.0': - resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.21 <0.4.0' - '@langchain/textsplitters@1.0.1': resolution: {integrity: sha512-rheJlB01iVtrOUzttscutRgLybPH9qR79EyzBEbf1u97ljWyuxQfCwIWK+SjoQTM9O8M7GGLLRBSYE26Jmcoww==} engines: {node: '>=20'} peerDependencies: '@langchain/core': ^1.0.0 - '@langchain/weaviate@0.2.3': - resolution: {integrity: sha512-WqNGn1eSrI+ZigJd7kZjCj3fvHBYicKr054qts2nNJ+IyO5dWmY3oFTaVHFq1OLFVZJJxrFeDnxSEOC3JnfP0w==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': '>=0.2.21 <0.4.0' - '@ledgerhq/devices@8.10.0': resolution: {integrity: sha512-ytT66KI8MizFX6dGJKthOzPDw5uNRmmg+RaMta62jbFePKYqfXtYTp6Wc0ErTXaL8nFS3IujHENwKthPmsj6jw==} @@ -4497,44 +4476,41 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@mastra/core@1.21.0': - resolution: {integrity: sha512-DgFZpdvR1XR6tE/ocX+bhjlzGfjuSDPfiF0aWFYXpmvs66fKeLE/S/tWxkhWOPGr64e3fCU6U1GGOaPI1nh7OA==} + '@mastra/core@1.67.0': + resolution: {integrity: sha512-Z+kVa5SXpZ7c1xrycGOZ8tGFTDAeXYR+6rC8gAKY/m6Ac9dOPDaPCfQRmFHFxAgKIuxDj+bsauFPTnpkl9S4lw==} engines: {node: '>=22.13.0'} peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@mastra/deployer@1.21.0': - resolution: {integrity: sha512-+B9z1bNCS+cXHHy8GRtNzYP9N5zjRucK3MicSc28fzPCxGib7SbqDJdLvUIRdtaxBLG9chKqM2enToPuALKwSQ==} + '@mastra/deployer@1.67.0': + resolution: {integrity: sha512-C1pDaZowdY0Kv337/A9rv7+HEWLYFTiRkLy5YLAAlz8JetssnMRNwHu2ftV6lIE54HQtqopMwKtlKyJaYXZ0jQ==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.0.0-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 + '@mastra/core': '>=1.50.0-0 <2.0.0-0' - '@mastra/loggers@1.1.0': - resolution: {integrity: sha512-SwEsBsckP3/00th4iV80k5/rj2OjaArIR8fedPq4MMnWS1a6HurXjnFF4ISGHuiTVvsx15a+3sRVy0IfSFp+QQ==} + '@mastra/loggers@1.3.2': + resolution: {integrity: sha512-8rw+hVlXFiw28UjZ6uaKlyXqsn55aOtyA3n+tVzPGU7+mg0FJmuGNKsIFDz+gaATi5b5vZPjPDgOXWZGRFYoAg==} engines: {node: '>=22.13.0'} peerDependencies: '@mastra/core': '>=1.0.0-0 <2.0.0-0' - '@mastra/mcp@1.4.1': - resolution: {integrity: sha512-LvFSh7NlKB7sMNfJKy/38h4QNN49Kqo6MmeM4mT6l3D8obUyYaFtrscmosuEoD7JnRx0ASuptGWKW0x+Afxp1Q==} + '@mastra/mcp@1.18.0': + resolution: {integrity: sha512-t9oO9N4YKgdW04h9dQ0M0WysE2INxRGEn8zkqcIrHkVg6kLSpu4pFMoI37v09cXrgzjcAI7uWRFAgBgRz2Kxwg==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.0.0-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 + '@mastra/core': '>=1.64.0-0 <2.0.0-0' - '@mastra/memory@1.13.0': - resolution: {integrity: sha512-fNAQ/C2ArKhmZwcRoy8oD1dEDKdIXyZrFMFX52GJzPcntlKx5YsL58BOB3kilFi/kFzfEE6h3nemv0CgI7l+SA==} + '@mastra/memory@1.30.0': + resolution: {integrity: sha512-rzl1tQLorwvHU6Ayi9T0ZiEiE/zKJGgPIpxmnZXTTJ9mn+Bs5FQ7tB4DHPidHNy1SVHRUwg3HRtqMX+nAeREaQ==} engines: {node: '>=22.13.0'} peerDependencies: '@mastra/core': '>=1.4.1-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 - '@mastra/pg@1.8.5': - resolution: {integrity: sha512-TNHA1KfgLrFjkjxuCDvn0s2Kqd9J4ivxbqGxOG4LA43SP8djYVoergigk5Us1JDktFIxGQru/HmS3HIOti0/tg==} + '@mastra/pg@1.25.0': + resolution: {integrity: sha512-RRgIRMBIKeCT/i5Mr8zFB1Pu6h9nLGui5Sd4C0wY454rOflexuHp1pUwlGsLRc3sB/79PhpAzPzyPkOoOV9ufQ==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.4.0-0 <2.0.0-0' + '@mastra/core': '>=1.63.1-0 <2.0.0-0' '@mastra/schema-compat@0.11.4': resolution: {integrity: sha512-oh3+enP3oYftZlmJAKQQj5VXR86KgTMwfMnwALZyLk04dPSWfVD2wGytoDg5Qbi3rX9qHj6g0rMNa0CUjR6aTg==} @@ -4542,19 +4518,22 @@ packages: ai: ^4.0.0 || ^5.0.0 zod: ^3.25.0 || ^4.0.0 - '@mastra/schema-compat@1.2.7': - resolution: {integrity: sha512-t63E0f5HcH8neXPfs3D5x4qqQM6Pf/pbhFUVk0cTC0bFo6609sT/+189I+2HY4sbAF3uzurOgy2fXIS4vfMkOA==} + '@mastra/schema-compat@1.3.10': + resolution: {integrity: sha512-ZrjvutWy3QJoJROA5PeSFdeFwDgyfGN1sOOObFirex9h9c/R4ReqRllCojNHSN0cKsKxkRlH6zBbWVTiybamUw==} engines: {node: '>=22.13.0'} peerDependencies: zod: ^3.25.0 || ^4.0.0 - '@mastra/server@1.21.0': - resolution: {integrity: sha512-VZTzNlsumEpibXjvDDyTbY9UzBgwa+TGO7CRReP+oaqfxu+kFi98ni9LuVGRQ8Hm9RhzuaO+PeRaVkxKgLN9oQ==} + '@mastra/server@1.67.0': + resolution: {integrity: sha512-tHez2qnKWMhfmjZrz6jFgSYxGAgIxm5Cb840qB7XmCr7o6Cjf1vlwOwCR4+112osBKu2lrnO0FNeNyg/7ueL/w==} engines: {node: '>=22.13.0'} peerDependencies: - '@mastra/core': '>=1.13.2-0 <2.0.0-0' + '@mastra/core': '>=1.50.0-0 <2.0.0-0' zod: ^3.25.0 || ^4.0.0 + '@mermaid-js/parser@1.2.1': + resolution: {integrity: sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==} + '@meronex/icons@4.0.0': resolution: {integrity: sha512-WnoxUT02qawZSvsoPSwe7YOqOk0APysIHugiD3dYdc/QNeoigN4PD8mmmtmZFKlv8/Z7eERub0BmPkWcJ1BI+w==} peerDependencies: @@ -4563,6 +4542,38 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@modelcontextprotocol/client@2.0.0': + resolution: {integrity: sha512-8f1OghQ2rjzIOfqgUCP+8GiUWqRs89njoWLNqAe8kWmDePv3s1fZXseej+QXemssEuuOvLLmLO/kqM3IQHtISw==} + engines: {node: '>=20'} + + '@modelcontextprotocol/core@2.0.0': + resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==} + engines: {node: '>=20'} + + '@modelcontextprotocol/ext-apps@1.7.5': + resolution: {integrity: sha512-TjPH2S2y5UEGKhmI6+XGFuqfqOV4ppe1x6DA3txnUaEWkgtA4G5vo14jGKFZmegdkZ1H4QMLyujLvoU1BEdnAg==} + engines: {node: '>=20'} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.29.0 + react: 19.2.4 + react-dom: 19.2.4 + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@modelcontextprotocol/node@2.0.0': + resolution: {integrity: sha512-Y4hAC2XdGDUdDOCbLDOCA4+aL3NUldjsOWlDL/YwpAxrPhRm1xHd7lZ+mLacvZ9t3PaH28wgNoaLQGrIk1P2pg==} + engines: {node: '>=20'} + peerDependencies: + '@modelcontextprotocol/server': ^2.0.0 + hono: ^4.11.4 + peerDependenciesMeta: + hono: + optional: true + '@modelcontextprotocol/sdk@1.27.1': resolution: {integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==} engines: {node: '>=18'} @@ -4573,6 +4584,30 @@ packages: '@cfworker/json-schema': optional: true + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@modelcontextprotocol/server-legacy@2.0.0': + resolution: {integrity: sha512-LnffC1BSqFMHtMQxEz92lqDpHWma+ErV3ghdHDgdkCyYzVcCYKcUT5loq4kflty+Bf9C9qjJqbnphyBWyCqo8Q==} + engines: {node: '>=20'} + deprecated: This package is a frozen copy of v1's SSE transport and OAuth Authorization Server helpers for migration purposes only. Use StreamableHTTP from @modelcontextprotocol/server and a dedicated OAuth server in production. Will not receive new features. + peerDependencies: + express: ^4.18.0 || ^5.0.0 + peerDependenciesMeta: + express: + optional: true + + '@modelcontextprotocol/server@2.0.0': + resolution: {integrity: sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==} + engines: {node: '>=20'} + '@mole-inc/bin-wrapper@8.0.1': resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4703,6 +4738,12 @@ packages: '@types/react': optional: true + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + '@napi-rs/nice-android-arm-eabi@1.1.1': resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} engines: {node: '>= 10'} @@ -6041,18 +6082,24 @@ packages: '@posthog/core@1.23.2': resolution: {integrity: sha512-zTDdda9NuSHrnwSOfFMxX/pyXiycF4jtU1kTr8DL61dHhV+7LF6XF1ndRZZTuaGGbfbb/GJYkEsjEX9SXfNZeQ==} - '@posthog/core@1.7.1': - resolution: {integrity: sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==} + '@posthog/core@1.54.2': + resolution: {integrity: sha512-p0NuMjiZkploKG/aASj4nw4QDuhF87SIFWkelaFRrr3G0Myb7KWWUZot2hm5qXpPx7zKozVZJrJkGzC2kGBqbg==} '@posthog/types@1.359.1': resolution: {integrity: sha512-oQihoHWLnOkSkzOToCWKNigbJ7UZcIkl+rSJuq2PLwL7EB0Q/r1UGSbVCkrPH8xtPbYpi7w4TVpMrg41TMT+LQ==} + '@posthog/types@1.412.1': + resolution: {integrity: sha512-FxXsb9YOOME8bJI5K09qKeSvLjnZQ2dPV7wZpI7a8sERQtXkAuhBcPB/balCnVE7TYwhgtHj5NQss9BgQ5bAfQ==} + '@postiz/wallets@0.0.1': resolution: {integrity: sha512-zCkg5ZXHZkyCREvoAtxQAp5IoCYfSQs9xonzyMvV/LoY32KjudV5wc4rb4R7NYNdPTGfcni1R8ETojASnK6oUw==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.77.3 + '@preact/signals-core@1.14.4': + resolution: {integrity: sha512-HNB6HYeYKhQbJ1aKl+YRjrS4+QWHLKX6qKoUsfS/m0vqzsVaEBiZiaKbG/e+NKk2ch5ALQr/ihWaMHxiCuuWHA==} + '@prisma/client@6.5.0': resolution: {integrity: sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==} engines: {node: '>=18.18'} @@ -6137,6 +6184,35 @@ packages: '@radix-ui/primitive@1.1.3': resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-arrow@1.1.15': + resolution: {integrity: sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.15': + resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.0.0': resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -6151,6 +6227,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.5': + resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.0.0': resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} peerDependencies: @@ -6165,6 +6250,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.2.2': + resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.0.0': resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} peerDependencies: @@ -6189,6 +6283,15 @@ packages: peerDependencies: react: 19.2.4 + '@radix-ui/react-direction@1.1.4': + resolution: {integrity: sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.0.0': resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} peerDependencies: @@ -6208,6 +6311,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.19': + resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.24': + resolution: {integrity: sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.0.0': resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} peerDependencies: @@ -6222,12 +6351,34 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.6': + resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.0.0': resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-focus-scope@1.1.16': + resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-scope@1.1.7': resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: @@ -6255,6 +6406,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-id@1.1.4': + resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-label@2.1.8': resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} peerDependencies: @@ -6268,12 +6428,51 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-menu@2.1.24': + resolution: {integrity: sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.3.7': + resolution: {integrity: sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.0.0': resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-portal@1.1.17': + resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.1.9': resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: @@ -6293,6 +6492,19 @@ packages: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-presence@1.1.10': + resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.1.5': resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: @@ -6318,6 +6530,19 @@ packages: react: 19.2.4 react-dom: 19.2.4 + '@radix-ui/react-primitive@2.1.10': + resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.1.3': resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: @@ -6344,6 +6569,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-roving-focus@1.1.19': + resolution: {integrity: sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-scroll-area@1.0.2': resolution: {integrity: sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==} peerDependencies: @@ -6391,6 +6629,28 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.3.3': + resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tooltip@1.2.16': + resolution: {integrity: sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-use-callback-ref@1.0.0': resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} peerDependencies: @@ -6405,6 +6665,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.4': + resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.0.0': resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} peerDependencies: @@ -6419,6 +6688,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.2.6': + resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-effect-event@0.0.2': resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: @@ -6428,6 +6706,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-effect-event@0.0.5': + resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.0.0': resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} peerDependencies: @@ -6442,6 +6729,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-is-hydrated@0.1.3': + resolution: {integrity: sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.0.0': resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} peerDependencies: @@ -6456,6 +6752,49 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.4': + resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.4': + resolution: {integrity: sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.4': + resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + peerDependencies: + '@types/react': 19.1.8 + react: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.11': + resolution: {integrity: sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==} + peerDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6 + react: 19.2.4 + react-dom: 19.2.4 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} + '@react-aria/focus@3.21.5': resolution: {integrity: sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q==} peerDependencies: @@ -6602,6 +6941,9 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@remix-run/node-fetch-server@0.13.3': + resolution: {integrity: sha512-UfjOXed/DQteaM5VyTfqTeGpHwyL2J5aoRGY6cydip4tt1ehNNeSwuXCC7AEGE0RWBs/7bgKxYkL/B/+UDe4AA==} + '@reown/appkit-common@1.7.2': resolution: {integrity: sha512-DZkl3P5+Iw3TmsitWmWxYbuSCox8iuzngNp/XhbNDJd7t4Cj4akaIUxSEeCajNDiGHlu4HZnfyM1swWsOJ0cOw==} @@ -6718,15 +7060,6 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/plugin-alias@6.0.0': - resolution: {integrity: sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==} - engines: {node: '>=20.19.0'} - peerDependencies: - rollup: '>=4.0.0' - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-commonjs@28.0.1': resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -6795,126 +7128,251 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.63.3': + resolution: {integrity: sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.59.0': resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.63.3': + resolution: {integrity: sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.59.0': resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.63.3': + resolution: {integrity: sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.59.0': resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.63.3': + resolution: {integrity: sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.59.0': resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.63.3': + resolution: {integrity: sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.59.0': resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.63.3': + resolution: {integrity: sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.63.3': + resolution: {integrity: sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.63.3': + resolution: {integrity: sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.63.3': + resolution: {integrity: sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.63.3': + resolution: {integrity: sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.63.3': + resolution: {integrity: sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-musl@4.63.3': + resolution: {integrity: sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.63.3': + resolution: {integrity: sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-musl@4.63.3': + resolution: {integrity: sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.63.3': + resolution: {integrity: sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.63.3': + resolution: {integrity: sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.63.3': + resolution: {integrity: sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.63.3': + resolution: {integrity: sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.63.3': + resolution: {integrity: sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} cpu: [x64] os: [openbsd] + '@rollup/rollup-openbsd-x64@4.63.3': + resolution: {integrity: sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==} + cpu: [x64] + os: [openbsd] + '@rollup/rollup-openharmony-arm64@4.59.0': resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.63.3': + resolution: {integrity: sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.59.0': resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.63.3': + resolution: {integrity: sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.59.0': resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.63.3': + resolution: {integrity: sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.59.0': resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.63.3': + resolution: {integrity: sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.59.0': resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.63.3': + resolution: {integrity: sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -7133,6 +7591,27 @@ packages: peerDependencies: webpack: '>=5.0.0' + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} @@ -7158,6 +7637,32 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@slack/bolt@4.7.3': + resolution: {integrity: sha512-bODs8q/yNDWUPoxmQhFrRqLMA5vhB/PDizYWqb6CkQhLWEUo5JFtfJcmeU4ElGl6qSt++OKjSYNa4MPc77CleQ==} + engines: {node: '>=18', npm: '>=8.6.0'} + peerDependencies: + '@types/express': ^5.0.0 + + '@slack/logger@4.0.1': + resolution: {integrity: sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@slack/oauth@3.0.5': + resolution: {integrity: sha512-exqFQySKhNDptWYSWhvRUJ4/+ndu2gayIy7vg/JfmJq3wGtGdHk531P96fAZyBm5c1Le3yaPYqv92rL4COlU3A==} + engines: {node: '>=18', npm: '>=8.6.0'} + + '@slack/socket-mode@2.0.7': + resolution: {integrity: sha512-qYy07je71WnEHgRwmw12DlAnZLi5HXmdlI2WUzUK2LH/rYXQpP6uEg462S5CwfE8FoCKUdIigHtYnOOfzZH1lQ==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@slack/types@2.22.0': + resolution: {integrity: sha512-sZ9lIgJhPX2qft/tKWiklFlc0o1FWeI7QtciZJfW1+ErH1eGGHvOZ8e73sleTCFEFJp1q/R0WeS8Oa7AsiDprg==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + + '@slack/web-api@7.19.0': + resolution: {integrity: sha512-ItjyjEZml+LDH8CjcCLRLJHh7VZtevPKExrRN3l5KWyBliyDnGAeoO4Y+K+fFBmRpKLYVPgqWMX4THldv2HVtA==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + '@smithy/abort-controller@4.2.11': resolution: {integrity: sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ==} engines: {node: '>=18.0.0'} @@ -7737,67 +8242,6 @@ packages: peerDependencies: '@solana/web3.js': '*' - '@standard-community/standard-json@0.3.5': - resolution: {integrity: sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA==} - peerDependencies: - '@standard-schema/spec': ^1.0.0 - '@types/json-schema': ^7.0.15 - '@valibot/to-json-schema': ^1.3.0 - arktype: ^2.1.20 - effect: ^3.16.8 - quansync: ^0.2.11 - sury: ^10.0.0 - typebox: ^1.0.17 - valibot: ^1.1.0 - zod: ^3.25.0 || ^4.0.0 - zod-to-json-schema: ^3.24.5 - peerDependenciesMeta: - '@valibot/to-json-schema': - optional: true - arktype: - optional: true - effect: - optional: true - sury: - optional: true - typebox: - optional: true - valibot: - optional: true - zod: - optional: true - zod-to-json-schema: - optional: true - - '@standard-community/standard-openapi@0.2.9': - resolution: {integrity: sha512-htj+yldvN1XncyZi4rehbf9kLbu8os2Ke/rfqoZHCMHuw34kiF3LP/yQPdA0tQ940y8nDq3Iou8R3wG+AGGyvg==} - peerDependencies: - '@standard-community/standard-json': ^0.3.5 - '@standard-schema/spec': ^1.0.0 - arktype: ^2.1.20 - effect: ^3.17.14 - openapi-types: ^12.1.3 - sury: ^10.0.0 - typebox: ^1.0.0 - valibot: ^1.1.0 - zod: ^3.25.0 || ^4.0.0 - zod-openapi: ^4 - peerDependenciesMeta: - arktype: - optional: true - effect: - optional: true - sury: - optional: true - typebox: - optional: true - valibot: - optional: true - zod: - optional: true - zod-openapi: - optional: true - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -8105,12 +8549,24 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 + '@tanstack/devtools-event-client@0.4.4': + resolution: {integrity: sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw==} + engines: {node: '>=18'} + hasBin: true + + '@tanstack/pacer@0.20.1': + resolution: {integrity: sha512-ZNQ1bIL6eUXVKdic0tiImvBVkWrg/IoSK6VIacTrO3d3HAGnd70qFJNJagR/YOJIOw4EKGWnodwpYZkN1pWuVQ==} + engines: {node: '>=18'} + '@tanstack/react-virtual@3.13.21': resolution: {integrity: sha512-SYXFrmrbPgXBvf+HsOsKhFgqSe4M6B29VHOsX9Jih9TlNkNkDWx0hWMiMLUghMEzyUz772ndzdEeCEBx+3GIZw==} peerDependencies: react: 19.2.4 react-dom: 19.2.4 + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + '@tanstack/virtual-core@3.13.21': resolution: {integrity: sha512-ww+fmLHyCbPSf7JNbWZP3g7wl6SdNo3ah5Aiw+0e9FDErkVHLKprYUrwTm7dF646FtEkN/KkAKPYezxpmvOjxw==} @@ -8479,6 +8935,99 @@ packages: '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.1': + resolution: {integrity: sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.4': + resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.12': + resolution: {integrity: sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==} + + '@types/d3-shape@3.2.0': + resolution: {integrity: sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -8503,6 +9052,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/express-serve-static-core@4.19.8': resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} @@ -8524,6 +9076,12 @@ packages: '@types/filewriter@0.0.33': resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -8560,6 +9118,9 @@ packages: '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -9243,6 +9804,9 @@ packages: peerDependencies: '@uppy/core': ^4.5.2 + '@upsetjs/venn.js@2.0.0': + resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==} + '@upstash/redis@1.36.3': resolution: {integrity: sha512-wxo1ei4OHDHm4UGMgrNVz9QUEela9N/Iwi4p1JlHNSowQiPi+eljlGnfbZVkV0V4PIrjGtGFJt5GjWM5k28enA==} @@ -9503,6 +10067,12 @@ packages: resolution: {integrity: sha512-kMwLlxUbduttIgaPdSkmEarFpP+mSY8FEm+QWMBRJwxOHWkri+cxd8KZHO9EMrB9vgUuz+5WEaCawaL5wGVoXg==} engines: {node: '>=18.0.0'} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + + '@workflow/serde@4.1.0-beta.2': + resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} + '@wyw-in-js/processor-utils@0.5.5': resolution: {integrity: sha512-L3IcAfoowhM0fw9Cnv2CNzfjWNLKpYl2CFqam6NvwpiXNR1kXz/GpO0AOiKvCs5h4Ps5kWxE2e8knXLpk8q/2g==} engines: {node: '>=16.0.0'} @@ -9521,9 +10091,6 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@zeit/schemas@2.36.0': - resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} - abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -9557,12 +10124,6 @@ packages: zod: optional: true - abort-controller-x@0.4.3: - resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} - - abort-controller-x@0.5.0: - resolution: {integrity: sha512-yTt9CI0x+nRfX6BFMenEGP8ooPvErGH6AbFz20C2IeOLIlDsrw/VHpgne3GsCEuTA410IiFiaLVFKmgM4bKEPQ==} - abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -9638,6 +10199,12 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 + ai@6.0.285: + resolution: {integrity: sha512-WfcHLHP8TvheInKofMlfpNzssKJ8HrqUNcQcjzAU28f9SFCYwEHhSjRu6m5saSvGcrObRG2ozXEv0IJWlEWVxA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -9670,12 +10237,12 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -9732,6 +10299,10 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + archiver@8.0.0: + resolution: {integrity: sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g==} + engines: {node: '>=18'} + are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} @@ -9851,6 +10422,9 @@ packages: async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -9897,6 +10471,14 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.9.0: + resolution: {integrity: sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9960,6 +10542,43 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bare-events@2.9.2: + resolution: {integrity: sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.8.1: + resolution: {integrity: sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==} + engines: {bare: '>=1.28.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.2: + resolution: {integrity: sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==} + + bare-stream@2.13.4: + resolution: {integrity: sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.5.4: + resolution: {integrity: sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} @@ -10070,10 +10689,6 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - boxen@7.0.0: - resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} - engines: {node: '>=14.16'} - brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -10135,6 +10750,10 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -10221,10 +10840,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - caniuse-lite@1.0.30001777: resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} @@ -10248,18 +10863,10 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.0.1: - resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -10274,21 +10881,12 @@ packages: character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} @@ -10302,6 +10900,21 @@ packages: resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} engines: {pnpm: '>=8'} + chat@4.40.0: + resolution: {integrity: sha512-slu3VDxItlelEZ8A5vqzlmtT2WErqj2YCGuhhcNx+Ev0+wHeBUqUDUA7hXkca+BfFtW1ZX7ECcySCTG2q2gefg==} + engines: {node: '>=20'} + peerDependencies: + ai: ^6.0.182 || ^7.0.0 + workflow: ^5.0.0-beta.35 + zod: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + ai: + optional: true + workflow: + optional: true + zod: + optional: true + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} @@ -10358,6 +10971,10 @@ packages: cjs-module-lexer@2.2.0: resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + clarinet@0.12.6: + resolution: {integrity: sha512-0FR+TrvLbYHLjhzs9oeIbd3yfZmd4u2DzYQEjUTm2dNfh4Y/9RIRWPjsm3aBtrVEpjKI7+lWa4ouqEXoml84mQ==} + engines: {chrome: '>=16.0.912', firefox: '>=0.8.0', node: '>=0.3.6'} + class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} @@ -10373,6 +10990,9 @@ packages: class-variance-authority@0.6.1: resolution: {integrity: sha512-eurOEGc7YVx3majOrOb099PNKgO3KnKSApOprXI4BTq6bcfbqbQXPN2u+rPPmIJ2di23bMwhk0SxCCthBmszEQ==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + classnames@2.3.1: resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} @@ -10383,10 +11003,6 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -10406,10 +11022,6 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -10485,9 +11097,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -10540,6 +11149,10 @@ packages: resolution: {integrity: sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==} engines: {node: '>=18'} + compress-commons@7.0.1: + resolution: {integrity: sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ==} + engines: {node: '>=18'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -10589,9 +11202,6 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - console-table-printer@2.15.0: - resolution: {integrity: sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==} - console.table@0.10.0: resolution: {integrity: sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g==} engines: {node: '> 0.10'} @@ -10678,6 +11288,12 @@ packages: resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -10691,6 +11307,15 @@ packages: typescript: optional: true + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@7.0.1: + resolution: {integrity: sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g==} + engines: {node: '>=18'} + crc@3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} @@ -10718,6 +11343,10 @@ packages: resolution: {integrity: sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ==} engines: {node: '>=18.x'} + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + cropperjs@1.6.2: resolution: {integrity: sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==} @@ -10821,6 +11450,162 @@ packages: custom-error-instance@2.1.1: resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.34.3: + resolution: {integrity: sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.14: + resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -10863,6 +11648,9 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} @@ -10872,6 +11660,9 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -10935,10 +11726,6 @@ packages: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -10972,6 +11759,9 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} + delaunator@5.1.0: + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} + delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} @@ -11051,6 +11841,10 @@ packages: resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -11200,6 +11994,10 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} @@ -11300,6 +12098,9 @@ packages: es-toolkit@1.33.0: resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} + es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} @@ -11321,8 +12122,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -11551,6 +12352,9 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -11559,6 +12363,10 @@ packages: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + eventsource@3.0.7: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} @@ -11669,6 +12477,9 @@ packages: resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} engines: {node: '>=6.0.0'} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -11696,11 +12507,11 @@ packages: fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - fast-string-truncated-width@1.2.1: - resolution: {integrity: sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} - fast-string-width@1.1.0: - resolution: {integrity: sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ==} + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} @@ -11708,8 +12519,8 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-wrap-ansi@0.1.6: - resolution: {integrity: sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fast-xml-builder@1.0.0: resolution: {integrity: sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==} @@ -11725,6 +12536,9 @@ packages: resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} hasBin: true + fastdom@1.0.12: + resolution: {integrity: sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==} + fastestsmallesttextencoderdecoder@1.0.22: resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} @@ -12011,6 +12825,10 @@ packages: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} + gaxios@7.3.1: + resolution: {integrity: sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==} + engines: {node: '>=18'} + gcp-metadata@5.3.0: resolution: {integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==} engines: {node: '>=12'} @@ -12019,6 +12837,10 @@ packages: resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} engines: {node: '>=14'} + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -12035,6 +12857,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} + engines: {node: '>=18'} + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -12146,6 +12972,10 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + google-auth-library@10.9.1: + resolution: {integrity: sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==} + engines: {node: '>=18'} + google-auth-library@8.9.0: resolution: {integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==} engines: {node: '>=12'} @@ -12158,6 +12988,10 @@ packages: resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} engines: {node: '>=14'} + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + google-p12-pem@4.0.1: resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} engines: {node: '>=12.0.0'} @@ -12195,11 +13029,6 @@ packages: peerDependencies: graphql: ^14.6.0 || ^15.0.0 || ^16.0.0 - graphql-request@6.1.0: - resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} - peerDependencies: - graphql: 14 - 16 - graphql-scalars@1.25.0: resolution: {integrity: sha512-b0xyXZeRFkne4Eq7NAnL400gStGqG/Sx9VqX0A05nHyEbv57UJnWKsjNnrpVqv5e/8N1MUxkt0wwcRXbiyKcFg==} engines: {node: '>=10'} @@ -12234,6 +13063,9 @@ packages: h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -12314,6 +13146,12 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -12329,9 +13167,6 @@ packages: hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - hast-util-parse-selector@3.1.1: resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} @@ -12341,6 +13176,9 @@ packages: hast-util-raw@9.1.0: resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + hast-util-select@6.0.4: resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} @@ -12356,14 +13194,18 @@ packages: hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + hast@1.0.0: + resolution: {integrity: sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==} + deprecated: Renamed to rehype hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} @@ -12463,21 +13305,6 @@ packages: zod-openapi: optional: true - hono-openapi@1.3.0: - resolution: {integrity: sha512-xDvCWpWEIv0weEmnl3EjRQzqbHIO8LnfzMuYOCmbuyE5aes6aXxLg4vM3ybnoZD5TiTUkA6PuRQPJs3R7WRBig==} - peerDependencies: - '@hono/standard-validator': ^0.2.0 - '@standard-community/standard-json': ^0.3.5 - '@standard-community/standard-openapi': ^0.2.9 - '@types/json-schema': ^7.0.15 - hono: ^4.8.3 - openapi-types: ^12.1.3 - peerDependenciesMeta: - '@hono/standard-validator': - optional: true - hono: - optional: true - hono@4.12.10: resolution: {integrity: sha512-mx/p18PLy5og9ufies2GOSUqep98Td9q4i/EF6X7yJgAiIopxqdfIO3jbqsi3jRgTgw88jMDEzVKi+V2EF+27w==} engines: {node: '>=16.9.0'} @@ -12631,11 +13458,6 @@ packages: engines: {node: '>=16.x'} hasBin: true - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - engines: {node: '>=16.x'} - hasBin: true - image-to-pdf@3.0.2: resolution: {integrity: sha512-6/IQCt4f384zjQ1w8P7FHIN/tF0mau8RbAIydT/+wyfZ1RAb8E2fiKe9t/k0V880h0d3zRpw9Q1bM5AIgVL/4g==} @@ -12664,6 +13486,9 @@ packages: engines: {node: '>=8'} hasBin: true + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -12695,6 +13520,13 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + into-stream@6.0.0: resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} engines: {node: '>=10'} @@ -12717,15 +13549,9 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} @@ -12789,9 +13615,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -12800,6 +13623,9 @@ packages: engines: {node: '>=8'} hasBin: true + is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} @@ -12832,9 +13658,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -12899,10 +13722,6 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - is-port-reachable@4.0.0: - resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -13235,6 +14054,9 @@ packages: jose@6.2.0: resolution: {integrity: sha512-xsfE1TcSCbUdo6U07tR0mvhg0flGxU8tPLbF03mirl2ukGQENhUg4ubGYQnhVH0b5stLlPM+WOqDkEl1R1y5sQ==} + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -13243,6 +14065,9 @@ packages: resolution: {integrity: sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + js-base64@2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} @@ -13267,6 +14092,9 @@ packages: js-tiktoken@1.0.21: resolution: {integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -13424,6 +14252,10 @@ packages: resolution: {integrity: sha512-S0+riEvy1CK4VKse1ivMff8gmabe/prY7sKB3njjhyoLLsNFDQYtKNgXrbWUggGDCJBz7Fctl5i8fLCESHXzSg==} hasBin: true + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -13433,6 +14265,9 @@ packages: keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -13448,80 +14283,11 @@ packages: konva@10.2.0: resolution: {integrity: sha512-JBoz0Xjbf49UPxCZegZ4WseqOzJ+C4AUDOtJ9eBve5RS5Fcq/u8TdBD5fDl/uPFInpC3a9uycm0sRyZpF4hheg==} - langchain@0.3.37: - resolution: {integrity: sha512-1jPsZ6xsxkcQPUvqRjvfuOLwZLLyt49hzcOK7OYAJovIkkOxd5gzK4Yw6giPUQ8g4XHyvULNlWBz+subdkcokw==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/anthropic': '*' - '@langchain/aws': '*' - '@langchain/cerebras': '*' - '@langchain/cohere': '*' - '@langchain/core': '>=0.3.58 <0.4.0' - '@langchain/deepseek': '*' - '@langchain/google-genai': '*' - '@langchain/google-vertexai': '*' - '@langchain/google-vertexai-web': '*' - '@langchain/groq': '*' - '@langchain/mistralai': '*' - '@langchain/ollama': '*' - '@langchain/xai': '*' - axios: '*' - cheerio: '*' - handlebars: ^4.7.8 - peggy: ^3.0.2 - typeorm: '*' - peerDependenciesMeta: - '@langchain/anthropic': - optional: true - '@langchain/aws': - optional: true - '@langchain/cerebras': - optional: true - '@langchain/cohere': - optional: true - '@langchain/deepseek': - optional: true - '@langchain/google-genai': - optional: true - '@langchain/google-vertexai': - optional: true - '@langchain/google-vertexai-web': - optional: true - '@langchain/groq': - optional: true - '@langchain/mistralai': - optional: true - '@langchain/ollama': - optional: true - '@langchain/xai': - optional: true - axios: - optional: true - cheerio: - optional: true - handlebars: - optional: true - peggy: - optional: true - typeorm: - optional: true - - langsmith@0.3.87: - resolution: {integrity: sha512-XXR1+9INH8YX96FKWc5tie0QixWz6tOqAsAKfcJyPkE0xPep+NDz0IQLR32q4bn10QK3LqD2HN6T3n6z1YLW7Q==} + langchain@1.5.11: + resolution: {integrity: sha512-6Sx9N5ylAJ11WrP1QnJLSIo75UABZbshzTJgG28H4mXuGcDk+w+7ZaNLkmGIh9sy/3PZcYS8UrI2rvH6A8NYIg==} + engines: {node: '>=20'} peerDependencies: - '@opentelemetry/api': '*' - '@opentelemetry/exporter-trace-otlp-proto': '*' - '@opentelemetry/sdk-trace-base': '*' - openai: '*' - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@opentelemetry/exporter-trace-otlp-proto': - optional: true - '@opentelemetry/sdk-trace-base': - optional: true - openai: - optional: true + '@langchain/core': ^1.2.10 langsmith@0.5.17: resolution: {integrity: sha512-/MEqTL50YH2SUZJtRl4+xI/tIgvu8OG5v6PMALKNkznjIelzf9q9kw0xxj1PC+r/ammMjVD1V2z9JmiT3AMqsQ==} @@ -13553,6 +14319,16 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -13735,6 +14511,9 @@ packages: lit@3.1.0: resolution: {integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==} + lit@3.3.3: + resolution: {integrity: sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==} + load-esm@1.0.3: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} @@ -13895,10 +14674,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.7: - resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} - engines: {node: 20 || >=22} - lru-cache@11.3.5: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} @@ -13922,6 +14697,19 @@ packages: peerDependencies: react: 19.2.4 + lucide-react@0.525.0: + resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==} + peerDependencies: + react: 19.2.4 + + lucide-react@0.542.0: + resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==} + peerDependencies: + react: 19.2.4 + + lucide@0.525.0: + resolution: {integrity: sha512-sfehWlaE/7NVkcEQ4T9JD3eID8RNMIGJBBUq9wF3UFiJIrcMKRbU3g1KGfDk4svcW7yw8BtDLXaXo02scDtUYQ==} + luxon@3.7.2: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} @@ -13960,16 +14748,25 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@12.0.2: + resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} + engines: {node: '>= 18'} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + marky@1.3.0: resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} - mastra@1.3.19: - resolution: {integrity: sha512-ZN1ZQ4mjK2t9KNdD/kSBNr4m2TlEfcbGxWGHtnVQ5bU6Vn0YywCDhESEa+4djIVO88jkqb+8ETFavsTiCecLsg==} + mastra@1.30.0: + resolution: {integrity: sha512-fed0N9+0PuXfit8lEDDk+EP3amwczgon6W1EVlXV5ZB7ZyJyz+dzzcRh1TIeugVls34zBJvRjgbaqy0v6IJXlA==} engines: {node: '>=22.13.0'} hasBin: true peerDependencies: - '@mastra/core': '>=1.1.0-0 <2.0.0-0' - zod: ^3.25.0 || ^4.0.0 + '@mastra/core': '>=1.50.0-0 <2.0.0-0' material-icons@1.13.14: resolution: {integrity: sha512-kZOfc7xCC0rAT8Q3DQixYAeT+tBqZnxkseQtp2bxBxz7q5pMAC+wmit7vJn1g/l7wRU+HEPq23gER4iPjGs5Cg==} @@ -14107,6 +14904,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mermaid@11.17.2: + resolution: {integrity: sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -14175,6 +14975,35 @@ packages: micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-gSPnxgHDDqXYOBvQRq6lerrq9mjDhdtKn+7XETuXjxWcL62yZEfUdA28Ml1I2vDIPfAOIKLa0h2XDSGkInGHFQ==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly-util@2.1.1: + resolution: {integrity: sha512-egs6+12JU2yutskHY55FyR48ZiEcFOJFyk9rsiyIhcJ6IvWB6ABBqVrBw8IobqJTDZ/wdSr9eoXDPb5S2nW1bg==} + engines: {node: '>=16'} + peerDependencies: + micromark-util-types: '*' + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly@1.2.3: + resolution: {integrity: sha512-gRzVLUdjXBLX6zNPSnHGDoo+ZTp5zy+MZm0g3sv+3chPXY7l9gW+DnrcHcZh/jiPR6MjPKO4AEJNp4Aw6V9z5Q==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} @@ -14613,15 +15442,6 @@ packages: resolution: {integrity: sha512-hAWn8Hh2eewpB5McXR5EW81R3pR/ziuGhKCF3wFyUVCklanPqrIgMNr7jKCbzXeNVad0nUDfWpFRqh2u+zxQtw==} engines: {node: '>= 18.0.0'} - nice-grpc-client-middleware-retry@3.1.13: - resolution: {integrity: sha512-Q9I/wm5lYkDTveKFirrTHBkBY137yavXZ4xQDXTPIycUp7aLXD8xPTHFhqtAFWUw05aS91uffZZRgdv3HS0y/g==} - - nice-grpc-common@2.0.2: - resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} - - nice-grpc@2.1.14: - resolution: {integrity: sha512-GK9pKNxlvnU5FAdaw7i2FFuR9CqBspcE+if2tqnKXBcE0R8525wj4BZvfcwj7FjvqbssqKxRHt2nwedalbJlww==} - no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -14818,6 +15638,10 @@ packages: resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} engines: {node: '>=16'} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} @@ -14847,34 +15671,16 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} - openai@4.104.0: - resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - - openai@5.23.2: - resolution: {integrity: sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - openai@6.27.0: resolution: {integrity: sha512-osTKySlrdYrLYTt0zjhY8yp0JUBmWDCN+Q+QxsV4xMQnnoVFpylgKGgxwN8sSdTNw0G4y+WUXs4eCMWpyDNWZQ==} hasBin: true @@ -14899,9 +15705,15 @@ packages: zod: optional: true + openapi-fetch@0.17.0: + resolution: {integrity: sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + openapi-typescript-helpers@0.1.0: + resolution: {integrity: sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==} + openapi3-ts@3.2.0: resolution: {integrity: sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg==} @@ -15027,6 +15839,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -15044,9 +15859,6 @@ packages: resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} engines: {node: '>= 0.10'} - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -15092,6 +15904,9 @@ packages: path-case@3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -15177,30 +15992,36 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - pg-cloudflare@1.3.0: - resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} + pg-cloudflare@1.4.0: + resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} pg-connection-string@2.12.0: resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} + pg-connection-string@2.14.0: + resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.13.0: - resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} + pg-pool@3.14.0: + resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} peerDependencies: pg: '>=8.0' pg-protocol@1.13.0: resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} + pg-protocol@1.16.0: + resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==} + pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.20.0: - resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==} + pg@8.23.0: + resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -15211,6 +16032,9 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + phoenix@1.8.14: + resolution: {integrity: sha512-erAGbssrbK7xe4l/tWXZTdsstCY+ufGTt/Kdin4uwceaP2TVqSL6v4s3flQOvIxShpwQx2/8NcOcBXOqgQ+ltw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -15218,10 +16042,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -15311,6 +16131,12 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + polotno@3.0.0-beta.25: resolution: {integrity: sha512-r1MyrHQ7lpQ7zNflXLfNbCZP1kYAtstiA2ez1GAu05goxg7TTnNGyT0Q8PYF/G3PpKoompAS7CXrUq5tXWdRWw==} peerDependencies: @@ -15403,9 +16229,14 @@ packages: posthog-js@1.359.1: resolution: {integrity: sha512-Gy/eX02im6ON0zMxfTR61GNk1sjgLT9rVGfBQ5C757/WS4mN3vTUJveQYoX9jr3y0pqPZ57DqCcf6zcw++bpzQ==} - posthog-node@5.17.2: - resolution: {integrity: sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==} - engines: {node: '>=20'} + posthog-node@5.52.4: + resolution: {integrity: sha512-P3p4OouGQfw/ouv+Px4gcVWLNwYsFB4JPyksYmxv7QRX4niwp1/C9XjQSUyl0nt+KoQnK14zFDfONHWVthwKDA==} + engines: {node: ^20.20.0 || >=22.22.0} + peerDependencies: + rxjs: ^7.0.0 + peerDependenciesMeta: + rxjs: + optional: true preact@10.28.4: resolution: {integrity: sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==} @@ -15419,11 +16250,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} - engines: {node: '>=14'} - hasBin: true - pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -15450,10 +16276,6 @@ packages: typescript: optional: true - prismjs@1.27.0: - resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} - engines: {node: '>=6'} - prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -15502,9 +16324,6 @@ packages: property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -15726,10 +16545,6 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-colorful@5.6.1: resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} peerDependencies: @@ -15954,8 +16769,9 @@ packages: '@types/react': optional: true - react-syntax-highlighter@15.6.6: - resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} + react-syntax-highlighter@16.1.1: + resolution: {integrity: sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA==} + engines: {node: '>= 16.20.2'} peerDependencies: react: 19.2.4 @@ -16023,6 +16839,10 @@ packages: resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} engines: {node: '>=8'} + readdir-glob@3.0.0: + resolution: {integrity: sha512-AhNB2KgKeVJr16nK9LLZbJNWnYoT23ZrumNKFDebHBdkC8KHSqWo871JAUhoWC/RtjEVdqNMFpM6qrwRbaUqpw==} + engines: {node: '>=18'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -16064,9 +16884,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - refractor@3.6.0: - resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} - refractor@4.9.0: resolution: {integrity: sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og==} @@ -16083,6 +16900,15 @@ packages: regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -16091,13 +16917,6 @@ packages: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} - registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} - - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} @@ -16112,10 +16931,16 @@ packages: rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + rehype-harden@1.1.8: + resolution: {integrity: sha512-Qn7vR1xrf6fZCrkm9TDWi/AB4ylrHy+jqsNm1EHOAmbARYA6gsnVJBq/sdBh6kmT4NEZxH5vgIjrscefJAOXcw==} + rehype-ignore@2.0.3: resolution: {integrity: sha512-IzhP6/u/6sm49sdktuYSmeIuObWB+5yC/5eqVws8BhuGA9kY25/byz6uCy/Ravj6lXUShEd2ofHM5MyAIj86Sg==} engines: {node: '>=16'} + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} @@ -16132,6 +16957,9 @@ packages: resolution: {integrity: sha512-L/FO96EOzSA6bzOam4DVu61/PB3AGKcSPXpa53yMIozoxH4qg1+bVZDF8zh1EsuxtSauAhzt5cCnvoplAaSLrw==} engines: {node: '>=16.0.0'} + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} @@ -16141,6 +16969,26 @@ packages: rehype@13.0.2: resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + remark-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-bXfMZtsaomK6ysNN/UGRIcasQAYkC10NtPmP0oOHOV8YOhA2TXmwRXCku4qOzjIFxAPfish5+XS0eIug2PzNZA==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + remark-cjk-friendly@1.2.3: + resolution: {integrity: sha512-UvAgxwlNk+l9Oqgl/9MWK2eWRS7zgBW/nXX9AthV7nd/3lNejF138E7Xbmk9Zs4WjTJGs721r7fAEc7tNFoH7g==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} @@ -16166,6 +17014,12 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remend@1.0.1: + resolution: {integrity: sha512-152puVH0qMoRJQFnaMG+rVDdf01Jq/CaED+MBuXExurJgdbkLp0c3TIe4R12o28Klx8uyGsjvFNG05aFG69G9w==} + + remend@1.3.1: + resolution: {integrity: sha512-N3DiY5qbRPoa5vkxn1oDLMyXOVTeo6Hp+XOj6SIqJAYUgLS0Q587gILPMom/qm86AQ/ZrcOdwEIzCz8V3J0nxQ==} + remove-markdown@0.5.5: resolution: {integrity: sha512-lMR8tOtDqazFT6W2bZidoXwkptMdF3pCxpri0AEokHg0sZlC2GdoLqnoaxsEj1o7/BtXV1MKtT3YviA1t7rW7g==} @@ -16278,6 +17132,9 @@ packages: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + rolldown@1.2.4: resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -16300,9 +17157,17 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.63.3: + resolution: {integrity: sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -16327,6 +17192,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} @@ -16473,11 +17341,6 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - serve@14.2.6: - resolution: {integrity: sha512-QEjUSA+sD4Rotm1znR8s50YqA3kYpRGPmtd5GlFxbaL9n/FdUNbqMhxClqdditSk0LlZyA/dhud6XNRTOC9x2Q==} - engines: {node: '>= 14'} - hasBin: true - server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -16543,6 +17406,9 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -16588,9 +17454,6 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} - simple-wcswidth@1.1.2: - resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} - sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} @@ -16693,9 +17556,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -16772,14 +17632,25 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamdown@1.6.11: + resolution: {integrity: sha512-Y38fwRx5kCKTluwM+Gf27jbbi9q6Qy+WC9YrC1YbCpMkktT3PsRBJHMWiqYeF8y/JzLpB1IzDoeaB6qkQEDnAA==} + peerDependencies: + react: 19.2.4 + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + streamx@2.28.1: + resolution: {integrity: sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} + strictdom@1.0.1: + resolution: {integrity: sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -16856,10 +17727,6 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -17012,6 +17879,9 @@ packages: tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + tailwind-merge@3.7.0: + resolution: {integrity: sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==} + tailwind-scrollbar@3.1.0: resolution: {integrity: sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==} engines: {node: '>=12.13.0'} @@ -17033,11 +17903,17 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar-stream@3.2.1: + resolution: {integrity: sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + terser-webpack-plugin@5.3.17: resolution: {integrity: sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==} engines: {node: '>= 10.13.0'} @@ -17063,6 +17939,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} @@ -17126,6 +18005,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -17278,8 +18161,9 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-error@1.0.6: - resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + ts-dedent@2.3.0: + resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} + engines: {node: '>=6.10'} ts-essentials@10.1.1: resolution: {integrity: sha512-4aTB7KLHKmUvkjNj8V+EdnmuVTiECzn3K+zIbRthumvHu+j44x3w63xpfs0JL3NGIzGXqoQ7AV591xHO+XrOTw==} @@ -17376,6 +18260,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + tsup@8.5.1: resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} @@ -17405,6 +18293,9 @@ packages: resolution: {integrity: sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==} engines: {node: '>=18'} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -17493,10 +18384,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - typescript-paths@1.5.1: - resolution: {integrity: sha512-lYErSLCON2MSplVV5V/LBgD4UNjMgY3guATdFCZY2q1Nr6OZEu4q6zX/rYMsG1TaWqqQSszg6C9EU7AGWMDrIw==} + typescript-paths@1.5.2: + resolution: {integrity: sha512-s5iiRIWOSw80dBgPACm0asPQZHHQcbPz69f26eRq01dStusuD11idZ0NDcAbkj6WuUGcRwJediPOsrArIS92eg==} peerDependencies: - typescript: ^4.7.2 || ^5 + typescript: ^4.7.2 || ^5 || ^6 typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} @@ -17549,6 +18440,14 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + undici@6.28.1: + resolution: {integrity: sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==} + engines: {node: '>=18.17'} + undici@7.25.0: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} @@ -17597,6 +18496,9 @@ packages: unist-util-filter@5.0.1: resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} @@ -17729,9 +18631,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} - upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} @@ -17819,6 +18718,11 @@ packages: '@types/react': optional: true + use-stick-to-bottom@1.1.6: + resolution: {integrity: sha512-z3Up8jYQGTkUCsGBnwg6/wj70KgXoW5Kz1AAc1j8MtQuYMBo6ZsdhrIXoegxa7gaMMilgQYyTohTrt3p94jHog==} + peerDependencies: + react: 19.2.4 + use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -17911,6 +18815,10 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} + verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} @@ -18101,10 +19009,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - weaviate-client@3.12.0: - resolution: {integrity: sha512-z61T1WA44meNMbabzQ6GSXWkZyc/wGcC17X8DTB5tPs0ojatwFmdySLtXLzSvvgmIeLn+PI0+7eZgg42XYbAIw==} - engines: {node: '>=20.0.0'} - web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -18241,10 +19145,6 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - wildcard@1.1.2: resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} @@ -18328,6 +19228,18 @@ packages: utf-8-validate: optional: true + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -18401,6 +19313,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -18440,6 +19357,10 @@ packages: yup@1.7.1: resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==} + zip-stream@7.0.5: + resolution: {integrity: sha512-dSvYKdvLsAHCDqPOhIwk/q5CvuWtTB3Dgpoe0uVEFjTzIOAmsQpprX25InCvrvJsirEbu1OHyy67n/kAj1Sw/w==} + engines: {node: '>=18'} + zod-from-json-schema@0.0.5: resolution: {integrity: sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ==} @@ -18451,6 +19372,11 @@ packages: peerDependencies: zod: ^3.25 || ^4 + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -18466,6 +19392,9 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} + zustand@5.0.11: resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} engines: {node: '>=12.20.0'} @@ -18504,13 +19433,46 @@ snapshots: transitivePeerDependencies: - supports-color + '@a2a-js/sdk@0.3.14(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)': + dependencies: + uuid: 11.1.0 + optionalDependencies: + '@bufbuild/protobuf': 2.11.0 + '@grpc/grpc-js': 1.14.3 + express: 5.2.1 + + '@a2a-js/sdk@1.0.1(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)': + dependencies: + jose: 6.2.12 + uuid: 11.1.0 + optionalDependencies: + '@bufbuild/protobuf': 2.11.0 + '@grpc/grpc-js': 1.14.3 + express: 5.2.1 + + '@a2ui/web_core@0.10.4': + dependencies: + '@preact/signals-core': 1.14.4 + date-fns: 4.4.0 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + '@adraffy/ens-normalize@1.11.1': {} - '@ag-ui/client@0.0.47': + '@ag-ui/a2ui-middleware@0.0.10(@ag-ui/client@0.0.59)(rxjs@7.8.1)': + dependencies: + '@ag-ui/a2ui-toolkit': 0.0.4 + '@ag-ui/client': 0.0.59 + clarinet: 0.12.6 + rxjs: 7.8.1 + + '@ag-ui/a2ui-toolkit@0.0.4': {} + + '@ag-ui/client@0.0.59': dependencies: - '@ag-ui/core': 0.0.47 - '@ag-ui/encoder': 0.0.47 - '@ag-ui/proto': 0.0.47 + '@ag-ui/core': 0.0.59 + '@ag-ui/encoder': 0.0.59 + '@ag-ui/proto': 0.0.59 '@types/uuid': 10.0.0 compare-versions: 6.1.1 fast-json-patch: 3.1.1 @@ -18519,27 +19481,23 @@ snapshots: uuid: 11.1.0 zod: 3.25.76 - '@ag-ui/core@0.0.37': - dependencies: - rxjs: 7.8.1 - zod: 3.25.76 - - '@ag-ui/core@0.0.47': + '@ag-ui/core@0.0.59': dependencies: - rxjs: 7.8.1 zod: 3.25.76 - '@ag-ui/encoder@0.0.47': + '@ag-ui/encoder@0.0.59': dependencies: - '@ag-ui/core': 0.0.47 - '@ag-ui/proto': 0.0.47 + '@ag-ui/core': 0.0.59 + '@ag-ui/proto': 0.0.59 - '@ag-ui/langgraph@0.0.24(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@ag-ui/langgraph@0.0.43(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: - '@ag-ui/client': 0.0.47 - '@ag-ui/core': 0.0.47 - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@ag-ui/a2ui-toolkit': 0.0.4 + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph-sdk': 1.8.8(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + langchain: 1.5.11(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) partial-json: 0.1.7 rxjs: 7.8.1 transitivePeerDependencies: @@ -18549,31 +19507,67 @@ snapshots: - openai - react - react-dom + - svelte + - vue + - ws - '@ag-ui/mastra@1.0.1(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@copilotkit/runtime@1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + '@ag-ui/mastra@1.1.4(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@copilotkit/runtime@1.72.0(060090e105863d9983aa04d300df3d3a))(@mastra/client-js@0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: - '@ag-ui/client': 0.0.47 - '@ag-ui/core': 0.0.47 + '@ag-ui/a2ui-toolkit': 0.0.4 + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - '@copilotkit/runtime': 1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1) + '@copilotkit/runtime': 1.72.0(060090e105863d9983aa04d300df3d3a) '@mastra/client-js': 0.15.2(openapi-types@12.1.3)(react@19.2.4)(zod@3.25.76) - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) + fast-json-patch: 3.1.1 + rxjs: 7.8.1 + zod: 3.25.76 + + '@ag-ui/mcp-apps-middleware@0.1.1(@ag-ui/client@0.0.59)(@cfworker/json-schema@4.1.1)(rxjs@7.8.1)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + rxjs: 7.8.1 + transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color + - zod + + '@ag-ui/mcp-middleware@0.0.2(@ag-ui/client@0.0.59)(@cfworker/json-schema@4.1.1)(rxjs@7.8.1)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) rxjs: 7.8.1 transitivePeerDependencies: + - '@cfworker/json-schema' + - supports-color - zod - '@ag-ui/proto@0.0.47': + '@ag-ui/proto@0.0.59': dependencies: - '@ag-ui/core': 0.0.47 + '@ag-ui/core': 0.0.59 '@bufbuild/protobuf': 2.11.0 '@protobuf-ts/protoc': 2.11.1 + '@ai-sdk/anthropic@2.0.102(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/anthropic@2.0.23(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/anthropic@3.0.118(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/gateway@1.0.33(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -18581,18 +19575,63 @@ snapshots: '@vercel/oidc': 3.2.0 zod: 3.25.76 + '@ai-sdk/gateway@3.0.196(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + '@vercel/oidc': 3.2.0 + zod: 3.25.76 + + '@ai-sdk/google-vertex@3.0.174(zod@3.25.76)': + dependencies: + '@ai-sdk/anthropic': 2.0.102(zod@3.25.76) + '@ai-sdk/google': 2.0.97(zod@3.25.76) + '@ai-sdk/openai-compatible': 1.0.54(zod@3.25.76) + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + google-auth-library: 10.9.1 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + '@ai-sdk/google@2.0.17(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/google@2.0.97(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/google@3.0.123(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/mcp@1.0.81(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + cross-spawn: 7.0.6 + pkce-challenge: 5.0.1 + zod: 3.25.76 + '@ai-sdk/openai-compatible@1.0.19(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/openai-compatible@1.0.54(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.4 + '@ai-sdk/provider-utils': 3.0.37(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/openai@2.0.42(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 @@ -18605,6 +19644,12 @@ snapshots: '@ai-sdk/provider-utils': 3.0.22(zod@3.25.76) zod: 3.25.76 + '@ai-sdk/openai@3.0.113(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + zod: 3.25.76 + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -18616,28 +19661,45 @@ snapshots: dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.1 zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.22(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.1 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.22(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.37(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider': 2.0.4 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.1 + undici: 5.29.0 zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.0(zod@3.25.76)': + '@ai-sdk/provider-utils@4.0.40(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 3.0.0 + '@ai-sdk/provider': 3.0.14 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.1 + zod: 3.25.76 + + '@ai-sdk/provider-utils@4.0.51(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.16 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.1.1 + undici: 6.28.1 + zod: 3.25.76 + + '@ai-sdk/provider-utils@5.0.13(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 4.0.4 + '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.1.1 zod: 3.25.76 '@ai-sdk/provider@1.1.3': @@ -18652,11 +19714,23 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.0': + '@ai-sdk/provider@2.0.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@2.0.4': dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@3.0.5': + '@ai-sdk/provider@3.0.14': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@3.0.16': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@4.0.4': dependencies: json-schema: 0.4.0 @@ -18724,6 +19798,11 @@ snapshots: transitivePeerDependencies: - chokidar + '@antfu/install-pkg@2.1.0': + dependencies: + package-manager-detector: 1.8.0 + tinyexec: 1.3.1 + '@anthropic-ai/sdk@0.27.3': dependencies: '@types/node': 18.16.9 @@ -18736,7 +19815,8 @@ snapshots: transitivePeerDependencies: - encoding - '@anthropic-ai/sdk@0.57.0': {} + '@anthropic-ai/sdk@0.57.0': + optional: true '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: @@ -18744,11 +19824,6 @@ snapshots: '@types/json-schema': 7.0.15 js-yaml: 4.1.1 - '@apidevtools/json-schema-ref-parser@14.2.1(@types/json-schema@7.0.15)': - dependencies: - '@types/json-schema': 7.0.15 - js-yaml: 4.1.1 - '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 @@ -18907,7 +19982,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -18921,6 +19996,7 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - aws-crt + optional: true '@aws-sdk/client-bedrock-runtime@3.1003.0': dependencies: @@ -18958,7 +20034,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -18973,6 +20049,7 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - aws-crt + optional: true '@aws-sdk/client-kendra@3.1003.0': dependencies: @@ -19003,7 +20080,7 @@ snapshots: '@smithy/node-http-handler': 4.4.14 '@smithy/protocol-http': 5.3.11 '@smithy/smithy-client': 4.12.2 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 '@smithy/url-parser': 4.2.11 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 @@ -19017,6 +20094,7 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - aws-crt + optional: true '@aws-sdk/client-s3@3.1003.0': dependencies: @@ -19209,6 +20287,7 @@ snapshots: '@smithy/eventstream-codec': 4.2.11 '@smithy/types': 4.18.0 tslib: 2.8.1 + optional: true '@aws-sdk/lib-storage@3.1003.0(@aws-sdk/client-s3@3.1003.0)': dependencies: @@ -19237,6 +20316,7 @@ snapshots: '@smithy/protocol-http': 5.3.11 '@smithy/types': 4.18.0 tslib: 2.8.1 + optional: true '@aws-sdk/middleware-expect-continue@3.972.7': dependencies: @@ -19336,6 +20416,7 @@ snapshots: '@smithy/util-hex-encoding': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + optional: true '@aws-sdk/nested-clients@3.996.6': dependencies: @@ -19477,8 +20558,15 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@8.0.0': + dependencies: + '@babel/helper-validator-identifier': 8.0.4 + js-tokens: 10.0.0 + '@babel/compat-data@7.29.0': {} + '@babel/compat-data@8.0.5': {} + '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -19499,6 +20587,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@8.0.5': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.5 + '@babel/helper-compilation-targets': 8.0.5 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.5 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.0.1 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.2.1 + verkit: 0.3.2 + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.0 @@ -19507,10 +20614,23 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@8.0.5': + dependencies: + '@babel/parser': 8.0.5 + '@babel/types': 8.0.5 + '@jridgewell/gen-mapping': 0.4.0-beta.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.29.0 + '@babel/helper-annotate-as-pure@8.0.0': + dependencies: + '@babel/types': 8.0.5 + '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.29.0 @@ -19519,6 +20639,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@8.0.5': + dependencies: + '@babel/compat-data': 8.0.5 + '@babel/helper-validator-option': 8.0.0 + browserslist: 4.28.1 + lru-cache: 11.3.5 + verkit: 0.3.2 + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19532,6 +20660,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@8.0.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-member-expression-to-functions': 8.0.5 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.5) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/traverse': 8.0.5 + verkit: 0.3.2 + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19552,6 +20691,8 @@ snapshots: '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@8.0.0': {} + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: '@babel/traverse': 7.29.0 @@ -19559,6 +20700,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-member-expression-to-functions@8.0.5': + dependencies: + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.29.0 @@ -19566,6 +20712,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@8.0.0': + dependencies: + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19575,12 +20726,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@8.0.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-module-imports': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + '@babel/traverse': 8.0.5 + '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.29.0 + '@babel/helper-optimise-call-expression@8.0.0': + dependencies: + '@babel/types': 8.0.5 + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19599,6 +20765,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-member-expression-to-functions': 8.0.5 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/traverse': 8.0.5 + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.29.0 @@ -19606,12 +20779,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + dependencies: + '@babel/traverse': 8.0.5 + '@babel/types': 8.0.5 + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@8.0.0': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@8.0.4': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@8.0.0': {} + '@babel/helper-wrap-function@7.28.6': dependencies: '@babel/template': 7.28.6 @@ -19625,10 +20809,19 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 + '@babel/helpers@8.0.5': + dependencies: + '@babel/template': 8.0.0 + '@babel/types': 8.0.5 + '@babel/parser@7.29.0': dependencies: '@babel/types': 7.29.0 + '@babel/parser@8.0.5': + dependencies: + '@babel/types': 8.0.5 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19673,21 +20866,41 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19698,16 +20911,31 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19718,46 +20946,91 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@8.0.3(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -19932,6 +21205,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-module-transforms': 8.0.5(@babel/core@8.0.5) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20119,6 +21398,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-typescript@8.0.5(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-create-class-features-plugin': 8.0.5(@babel/core@8.0.5) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/plugin-syntax-typescript': 8.0.3(@babel/core@8.0.5) + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -20248,6 +21536,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@8.0.1(@babel/core@8.0.5)': + dependencies: + '@babel/core': 8.0.5 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.5) + '@babel/helper-validator-option': 8.0.0 + '@babel/plugin-transform-modules-commonjs': 8.0.1(@babel/core@8.0.5) + '@babel/plugin-transform-typescript': 8.0.5(@babel/core@8.0.5) + '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': @@ -20256,6 +21552,12 @@ snapshots: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 + '@babel/template@8.0.0': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/parser': 8.0.5 + '@babel/types': 8.0.5 + '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -20268,11 +21570,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@8.0.5': + dependencies: + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.5 + '@babel/helper-globals': 8.0.0 + '@babel/parser': 8.0.5 + '@babel/template': 8.0.0 + '@babel/types': 8.0.5 + obug: 2.2.1 + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@8.0.5': + dependencies: + '@babel/helper-string-parser': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + '@bcoe/v8-coverage@0.2.3': {} '@blueprintjs/colors@5.1.16': @@ -20322,6 +21639,8 @@ snapshots: '@borewit/text-codec@0.2.2': {} + '@braintree/sanitize-url@7.1.2': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 @@ -20346,9 +21665,9 @@ snapshots: deepmerge: 4.3.1 dotenv: 16.6.1 openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - bufferutil - encoding @@ -20367,41 +21686,194 @@ snapshots: '@cfworker/json-schema@4.1.1': {} - '@clack/core@1.2.0': + '@chevrotain/types@11.1.2': {} + + '@clack/core@1.5.1': dependencies: - fast-wrap-ansi: 0.1.6 + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@1.2.0': + '@clack/prompts@1.8.1': dependencies: - '@clack/core': 1.2.0 - fast-string-width: 1.1.0 - fast-wrap-ansi: 0.1.6 + '@clack/core': 1.5.1 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 '@colors/colors@1.5.0': optional: true - '@copilotkit/react-core@1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@copilotkit/a2ui-renderer@1.72.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@a2ui/web_core': 0.10.4 + clsx: 2.1.1 + lit: 3.3.3 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@copilotkit/channels-core@0.10.0(vitest@3.1.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) + transitivePeerDependencies: + - encoding + - zod + + '@copilotkit/channels-intelligence@0.10.0(@ag-ui/core@0.0.59)(@types/express@4.17.25)(bufferutil@4.1.0)(express@4.22.1)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-slack': 0.10.0(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-teams': 0.10.0(express@4.22.1)(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + phoenix: 1.8.14 + transitivePeerDependencies: + - '@ag-ui/core' + - '@microsoft/agents-activity' + - '@microsoft/agents-hosting' + - '@types/express' + - bufferutil + - debug + - encoding + - express + - supports-color + - utf-8-validate + - vitest + - zod + + '@copilotkit/channels-slack@0.10.0(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@slack/bolt': 4.7.3(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@slack/types': 2.22.0 + '@slack/web-api': 7.19.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - encoding + - supports-color + - utf-8-validate + - vitest + - zod + + '@copilotkit/channels-teams@0.10.0(express@4.22.1)(vitest@3.1.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-ui': 0.10.0(@ag-ui/core@0.0.59) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + rxjs: 7.8.2 + optionalDependencies: + express: 4.22.1 + transitivePeerDependencies: + - encoding + - vitest + - zod + + '@copilotkit/channels-ui@0.10.0(@ag-ui/core@0.0.59)': dependencies: - '@copilotkit/runtime-client-gql': 1.10.6(graphql@16.13.1)(react@19.2.4) - '@copilotkit/shared': 1.10.6 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + transitivePeerDependencies: + - '@ag-ui/core' + - encoding + + '@copilotkit/core@1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@tanstack/pacer': 0.20.1 + phoenix: 1.8.14 + rxjs: 7.8.1 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@ag-ui/core' + - encoding + - zod + + '@copilotkit/license-verifier@0.5.0': {} + + '@copilotkit/mcp-apps-renderer@1.72.0(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@modelcontextprotocol/ext-apps': 1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - '@ag-ui/core' + - '@cfworker/json-schema' + - encoding + - react + - react-dom + - supports-color + + '@copilotkit/react-core@1.72.0(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/a2ui-renderer': 1.72.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/mcp-apps-renderer': 1.72.0(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@copilotkit/runtime-client-gql': 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + '@copilotkit/web-components': 1.72.0(lit@3.3.3) + '@copilotkit/web-inspector': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@jetbrains/websandbox': 1.4.1 + '@radix-ui/react-dropdown-menu': 2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-tooltip': 1.2.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@scarf/scarf': 1.4.0 + '@tanstack/react-virtual': 3.13.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + katex: 0.16.35 + lit: 3.3.3 + lucide-react: 0.525.0(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) react-markdown: 8.0.7(@types/react@19.1.8)(react@19.2.4) + rxjs: 7.8.1 + streamdown: 1.6.11(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4) + tailwind-merge: 3.7.0 + tw-animate-css: 1.4.0 untruncate-json: 0.0.1 + use-stick-to-bottom: 1.1.6(react@19.2.4) + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/mdast' - '@types/react' + - '@types/react-dom' - encoding - graphql + - micromark + - micromark-util-types - supports-color - '@copilotkit/react-textarea@1.10.6(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@copilotkit/react-textarea@1.72.0(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@copilotkit/react-core': 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@copilotkit/runtime-client-gql': 1.10.6(graphql@16.13.1)(react@19.2.4) - '@copilotkit/shared': 1.10.6 + '@copilotkit/react-core': 1.72.0(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@copilotkit/runtime-client-gql': 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@emotion/css': 11.13.5 '@emotion/react': 11.14.0(@types/react@19.1.8)(react@19.2.4) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.2.4))(@types/react@19.1.8)(react@19.2.4) @@ -20423,237 +21895,166 @@ snapshots: slate-react: 0.98.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(slate@0.94.1) tailwind-merge: 1.14.0 transitivePeerDependencies: + - '@ag-ui/core' + - '@cfworker/json-schema' + - '@types/mdast' - '@types/react' - '@types/react-dom' - encoding - graphql + - micromark + - micromark-util-types - supports-color + - zod - '@copilotkit/react-ui@1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@copilotkit/react-ui@1.72.0(@ag-ui/core@0.0.59)(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@copilotkit/react-core': 1.10.6(@types/react@19.1.8)(graphql@16.13.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@copilotkit/runtime-client-gql': 1.10.6(graphql@16.13.1)(react@19.2.4) - '@copilotkit/shared': 1.10.6 + '@copilotkit/react-core': 1.72.0(@cfworker/json-schema@4.1.1)(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.13.1)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@copilotkit/runtime-client-gql': 1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@headlessui/react': 2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-markdown: 10.1.0(@types/react@19.1.8)(react@19.2.4) - react-syntax-highlighter: 15.6.6(react@19.2.4) + react-syntax-highlighter: 16.1.1(react@19.2.4) rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 remark-gfm: 4.0.1 remark-math: 6.0.0 transitivePeerDependencies: + - '@ag-ui/core' + - '@cfworker/json-schema' + - '@types/mdast' - '@types/react' + - '@types/react-dom' - encoding - graphql + - micromark + - micromark-util-types - react-dom - supports-color + - zod - '@copilotkit/runtime-client-gql@1.10.6(graphql@16.13.1)(react@19.2.4)': + '@copilotkit/runtime-client-gql@1.72.0(@ag-ui/core@0.0.59)(graphql@16.13.1)(react@19.2.4)': dependencies: - '@copilotkit/shared': 1.10.6 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@urql/core': 5.2.0(graphql@16.13.1) react: 19.2.4 untruncate-json: 0.0.1 urql: 4.2.2(@urql/core@5.2.0(graphql@16.13.1))(react@19.2.4) transitivePeerDependencies: + - '@ag-ui/core' - encoding - graphql - '@copilotkit/runtime@1.10.6(c5ef6e30f9cb72b0a9db20b1502179b1)': - dependencies: - '@ag-ui/client': 0.0.47 - '@ag-ui/core': 0.0.47 - '@ag-ui/encoder': 0.0.47 - '@ag-ui/langgraph': 0.0.24(@ag-ui/client@0.0.47)(@ag-ui/core@0.0.47)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@ag-ui/proto': 0.0.47 - '@anthropic-ai/sdk': 0.57.0 - '@copilotkit/shared': 1.10.6 + '@copilotkit/runtime@1.72.0(060090e105863d9983aa04d300df3d3a)': + dependencies: + '@ag-ui/a2ui-middleware': 0.0.10(@ag-ui/client@0.0.59)(rxjs@7.8.1) + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@ag-ui/encoder': 0.0.59 + '@ag-ui/langgraph': 0.0.43(@ag-ui/client@0.0.59)(@ag-ui/core@0.0.59)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@ag-ui/mcp-apps-middleware': 0.1.1(@ag-ui/client@0.0.59)(@cfworker/json-schema@4.1.1)(rxjs@7.8.1)(zod@3.25.76) + '@ag-ui/mcp-middleware': 0.0.2(@ag-ui/client@0.0.59)(@cfworker/json-schema@4.1.1)(rxjs@7.8.1)(zod@3.25.76) + '@ai-sdk/anthropic': 3.0.118(zod@3.25.76) + '@ai-sdk/google': 3.0.123(zod@3.25.76) + '@ai-sdk/google-vertex': 3.0.174(zod@3.25.76) + '@ai-sdk/mcp': 1.0.81(zod@3.25.76) + '@ai-sdk/openai': 3.0.113(zod@3.25.76) + '@cfworker/json-schema': 4.1.1 + '@copilotkit/channels-core': 0.10.0(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/channels-intelligence': 0.10.0(@ag-ui/core@0.0.59)(@types/express@4.17.25)(bufferutil@4.1.0)(express@4.22.1)(utf-8-validate@5.0.10)(vitest@3.1.4)(zod@3.25.76) + '@copilotkit/license-verifier': 0.5.0 + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) '@graphql-yoga/plugin-defer-stream': 3.18.0(graphql-yoga@5.18.0(graphql@16.13.1))(graphql@16.13.1) - '@langchain/aws': 0.1.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - '@langchain/community': 0.3.59(bde0b9db2f2a07fbe92f00b76fe0eadb) - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(zod@3.25.76) - '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react@19.2.4) - '@langchain/openai': 0.4.9(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@hono/node-server': 1.19.11(hono@4.12.10) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@remix-run/node-fetch-server': 0.13.3 '@scarf/scarf': 1.4.0 + '@segment/analytics-node': 2.3.0 + '@types/cors': 2.8.19 + '@types/express': 4.17.25 + ai: 6.0.285(zod@3.25.76) + clarinet: 0.12.6 class-transformer: 0.5.1 class-validator: 0.14.4 + cors: 2.8.6 express: 4.22.1 graphql: 16.13.1 graphql-scalars: 1.25.0(graphql@16.13.1) graphql-yoga: 5.18.0(graphql@16.13.1) - groq-sdk: 0.5.0 - langchain: 0.3.37(@langchain/aws@0.1.15(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))))(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(axios@1.19.0)(cheerio@1.2.0)(handlebars@4.7.9)(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + hono: 4.12.10 partial-json: 0.1.7 - pino: 9.14.0 + phoenix: 1.8.14 + pino: 10.3.1 pino-pretty: 11.3.0 reflect-metadata: 0.2.2 rxjs: 7.8.1 type-graphql: 2.0.0-rc.1(class-validator@0.14.4)(graphql-scalars@1.25.0(graphql@16.13.1))(graphql@16.13.1) + uuid: 11.1.0 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) zod: 3.25.76 + optionalDependencies: + '@anthropic-ai/sdk': 0.57.0 + '@langchain/aws': 0.1.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/community': 1.1.27(66046857593e81cf94589e5d63e1e984) + '@langchain/google-gauth': 0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76) + '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/openai': 1.4.3(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + groq-sdk: 0.5.0 + langchain: 1.5.11(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) transitivePeerDependencies: - - '@arcjet/redact' - - '@aws-crypto/sha256-js' - - '@aws-sdk/client-bedrock-agent-runtime' - - '@aws-sdk/client-bedrock-runtime' - - '@aws-sdk/client-dynamodb' - - '@aws-sdk/client-kendra' - - '@aws-sdk/client-lambda' - - '@aws-sdk/client-s3' - - '@aws-sdk/client-sagemaker-runtime' - - '@aws-sdk/client-sfn' - - '@aws-sdk/credential-provider-node' - - '@aws-sdk/dsql-signer' - - '@azure/search-documents' - - '@azure/storage-blob' - - '@browserbasehq/sdk' - - '@browserbasehq/stagehand' - - '@clickhouse/client' - - '@cloudflare/ai' - - '@datastax/astra-db-ts' - - '@elastic/elasticsearch' - - '@getmetal/metal-sdk' - - '@getzep/zep-cloud' - - '@getzep/zep-js' - - '@gomomento/sdk' - - '@gomomento/sdk-core' - - '@google-ai/generativelanguage' - - '@google-cloud/storage' - - '@gradientai/nodejs-sdk' - - '@huggingface/inference' - - '@huggingface/transformers' - - '@ibm-cloud/watsonx-ai' - - '@lancedb/lancedb' - - '@langchain/anthropic' - - '@langchain/cerebras' - - '@langchain/cohere' - - '@langchain/deepseek' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/google-vertexai-web' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - '@langchain/xai' - - '@layerup/layerup-security' - - '@libsql/client' - - '@mendable/firecrawl-js' - - '@mlc-ai/web-llm' - - '@mozilla/readability' - - '@neondatabase/serverless' - - '@notionhq/client' - - '@opensearch-project/opensearch' + - '@microsoft/agents-activity' + - '@microsoft/agents-hosting' - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - - '@pinecone-database/pinecone' - - '@planetscale/database' - - '@premai/prem-sdk' - - '@qdrant/js-client-rest' - - '@raycast/api' - - '@rockset/client' - - '@smithy/eventstream-codec' - - '@smithy/protocol-http' - - '@smithy/signature-v4' - - '@smithy/util-utf8' - - '@spider-cloud/spider-client' - - '@supabase/supabase-js' - - '@tensorflow-models/universal-sentence-encoder' - - '@tensorflow/tfjs-converter' - - '@tensorflow/tfjs-core' - - '@upstash/ratelimit' - - '@upstash/redis' - - '@upstash/vector' - - '@vercel/kv' - - '@vercel/postgres' - - '@writerai/writer-sdk' - - '@xata.io/client' - - '@zilliz/milvus2-sdk-node' - - apify-client - - assemblyai - - aws-crt - - axios - - azion - - better-sqlite3 - - cassandra-driver - - cborg - - cheerio - - chromadb - - closevector-common - - closevector-node - - closevector-web - - cohere-ai - - convex - - crypto-js - - d3-dsv - - discord.js - - duck-duck-scrape + - bufferutil + - debug - encoding - - epub2 - - fast-xml-parser - - firebase-admin - - google-auth-library - - googleapis - - handlebars - - hnswlib-node - - html-to-text - - ibm-cloud-sdk-core - - ignore - - interface-datastore - - ioredis - - it-all - - jsdom - - jsonwebtoken - - llmonitor - - lodash - - lunary - - mammoth - - mariadb - - mem0ai - - mongodb - - mysql2 - - neo4j-driver - - notion-to-md - - officeparser - - pdf-parse - - peggy - - pg - - pg-copy-streams - - pickleparser - - playwright - - portkey-ai - - puppeteer - - pyodide - react - - redis - - replicate - - sonix-speech-recognition - - srt-parser-2 - - supports-color - - typeorm - - typesense - - usearch - - voy-search - - weaviate-client - - web-auth-library - - word-extractor - - ws - - youtubei.js + - react-dom + - supports-color + - svelte + - utf-8-validate + - vitest + - vue - '@copilotkit/shared@1.10.6': + '@copilotkit/shared@1.72.0(@ag-ui/core@0.0.59)': dependencies: - '@ag-ui/core': 0.0.37 + '@ag-ui/client': 0.0.59 + '@ag-ui/core': 0.0.59 + '@copilotkit/license-verifier': 0.5.0 '@segment/analytics-node': 2.3.0 + '@standard-schema/spec': 1.1.0 chalk: 4.1.2 graphql: 16.13.1 - uuid: 10.0.0 + partial-json: 0.1.7 + uuid: 11.1.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - encoding - '@crxjs/vite-plugin@2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@copilotkit/web-components@1.72.0(lit@3.3.3)': + dependencies: + lit: 3.3.3 + + '@copilotkit/web-inspector@1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76)': + dependencies: + '@ag-ui/client': 0.0.59 + '@copilotkit/core': 1.72.0(@ag-ui/core@0.0.59)(zod@3.25.76) + '@copilotkit/shared': 1.72.0(@ag-ui/core@0.0.59) + lit: 3.3.3 + lucide: 0.525.0 + marked: 12.0.2 + transitivePeerDependencies: + - '@ag-ui/core' + - encoding + - zod + + '@crxjs/vite-plugin@2.7.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@webcomponents/custom-elements': 1.6.0 acorn-walk: 8.3.5 @@ -20669,7 +22070,7 @@ snapshots: rollup: 2.80.0 rxjs: 7.5.7 tinyglobby: 0.2.17 - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -20732,8 +22133,6 @@ snapshots: tunnel-agent: 0.6.0 uuid: 8.3.2 - '@datastructures-js/deque@1.0.8': {} - '@dub/analytics@0.0.32': dependencies: server-only: 0.0.1 @@ -20877,7 +22276,7 @@ snapshots: '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/aix-ppc64@0.27.7': + '@esbuild/aix-ppc64@0.28.2': optional: true '@esbuild/android-arm64@0.25.12': @@ -20886,7 +22285,7 @@ snapshots: '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm64@0.27.7': + '@esbuild/android-arm64@0.28.2': optional: true '@esbuild/android-arm@0.25.12': @@ -20895,7 +22294,7 @@ snapshots: '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-arm@0.27.7': + '@esbuild/android-arm@0.28.2': optional: true '@esbuild/android-x64@0.25.12': @@ -20904,7 +22303,7 @@ snapshots: '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/android-x64@0.27.7': + '@esbuild/android-x64@0.28.2': optional: true '@esbuild/darwin-arm64@0.25.12': @@ -20913,7 +22312,7 @@ snapshots: '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.27.7': + '@esbuild/darwin-arm64@0.28.2': optional: true '@esbuild/darwin-x64@0.25.12': @@ -20922,7 +22321,7 @@ snapshots: '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.7': + '@esbuild/darwin-x64@0.28.2': optional: true '@esbuild/freebsd-arm64@0.25.12': @@ -20931,7 +22330,7 @@ snapshots: '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.27.7': + '@esbuild/freebsd-arm64@0.28.2': optional: true '@esbuild/freebsd-x64@0.25.12': @@ -20940,7 +22339,7 @@ snapshots: '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.27.7': + '@esbuild/freebsd-x64@0.28.2': optional: true '@esbuild/linux-arm64@0.25.12': @@ -20949,7 +22348,7 @@ snapshots: '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm64@0.27.7': + '@esbuild/linux-arm64@0.28.2': optional: true '@esbuild/linux-arm@0.25.12': @@ -20958,7 +22357,7 @@ snapshots: '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-arm@0.27.7': + '@esbuild/linux-arm@0.28.2': optional: true '@esbuild/linux-ia32@0.25.12': @@ -20967,7 +22366,7 @@ snapshots: '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-ia32@0.27.7': + '@esbuild/linux-ia32@0.28.2': optional: true '@esbuild/linux-loong64@0.25.12': @@ -20976,7 +22375,7 @@ snapshots: '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-loong64@0.27.7': + '@esbuild/linux-loong64@0.28.2': optional: true '@esbuild/linux-mips64el@0.25.12': @@ -20985,7 +22384,7 @@ snapshots: '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-mips64el@0.27.7': + '@esbuild/linux-mips64el@0.28.2': optional: true '@esbuild/linux-ppc64@0.25.12': @@ -20994,7 +22393,7 @@ snapshots: '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-ppc64@0.27.7': + '@esbuild/linux-ppc64@0.28.2': optional: true '@esbuild/linux-riscv64@0.25.12': @@ -21003,7 +22402,7 @@ snapshots: '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.27.7': + '@esbuild/linux-riscv64@0.28.2': optional: true '@esbuild/linux-s390x@0.25.12': @@ -21012,7 +22411,7 @@ snapshots: '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-s390x@0.27.7': + '@esbuild/linux-s390x@0.28.2': optional: true '@esbuild/linux-x64@0.25.12': @@ -21021,7 +22420,7 @@ snapshots: '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/linux-x64@0.27.7': + '@esbuild/linux-x64@0.28.2': optional: true '@esbuild/netbsd-arm64@0.25.12': @@ -21030,7 +22429,7 @@ snapshots: '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/netbsd-arm64@0.28.2': optional: true '@esbuild/netbsd-x64@0.25.12': @@ -21039,7 +22438,7 @@ snapshots: '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/netbsd-x64@0.28.2': optional: true '@esbuild/openbsd-arm64@0.25.12': @@ -21048,7 +22447,7 @@ snapshots: '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/openbsd-arm64@0.28.2': optional: true '@esbuild/openbsd-x64@0.25.12': @@ -21057,7 +22456,7 @@ snapshots: '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.27.7': + '@esbuild/openbsd-x64@0.28.2': optional: true '@esbuild/openharmony-arm64@0.25.12': @@ -21066,7 +22465,7 @@ snapshots: '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/openharmony-arm64@0.28.2': optional: true '@esbuild/sunos-x64@0.25.12': @@ -21075,7 +22474,7 @@ snapshots: '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/sunos-x64@0.27.7': + '@esbuild/sunos-x64@0.28.2': optional: true '@esbuild/win32-arm64@0.25.12': @@ -21084,7 +22483,7 @@ snapshots: '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-arm64@0.28.2': optional: true '@esbuild/win32-ia32@0.25.12': @@ -21093,7 +22492,7 @@ snapshots: '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-ia32@0.27.7': + '@esbuild/win32-ia32@0.28.2': optional: true '@esbuild/win32-x64@0.25.12': @@ -21102,7 +22501,7 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@esbuild/win32-x64@0.27.7': + '@esbuild/win32-x64@0.28.2': optional: true '@eslint-community/eslint-utils@4.9.1(eslint@8.57.0)': @@ -21148,6 +22547,8 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} + '@fastify/busboy@2.1.1': {} + '@fastify/busboy@3.2.0': {} '@fastify/otel@0.17.1(@opentelemetry/api@1.9.0)': @@ -21309,10 +22710,23 @@ snapshots: react-dom: 19.2.4(react@19.2.4) use-sync-external-store: 1.6.0(react@19.2.4) + '@hono/node-server@1.19.11(hono@4.12.10)': + dependencies: + hono: 4.12.10 + '@hono/node-server@1.19.11(hono@4.12.5)': dependencies: hono: 4.12.5 + '@hono/node-ws@1.3.1(@hono/node-server@1.19.11(hono@4.12.10))(bufferutil@4.1.0)(hono@4.12.10)(utf-8-validate@5.0.10)': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.10) + hono: 4.12.10 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@hookform/resolvers@3.10.0(react-hook-form@7.71.2(react@19.2.4))': dependencies: react-hook-form: 7.71.2(react@19.2.4) @@ -21338,6 +22752,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.1.7': + dependencies: + '@antfu/install-pkg': 2.1.0 + '@iconify/types': 2.0.0 + import-meta-resolve: 4.2.0 + '@img/colour@1.1.0': optional: true @@ -21702,7 +23124,7 @@ snapshots: '@isaacs/ttlcache@1.4.1': {} - '@isaacs/ttlcache@2.1.4': {} + '@isaacs/ttlcache@2.1.5': {} '@istanbuljs/load-nyc-config@1.1.0': dependencies: @@ -21880,11 +23302,18 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 + '@jetbrains/websandbox@1.4.1': {} + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.4.0-beta.0': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -21899,6 +23328,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -22101,6 +23532,7 @@ snapshots: '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) transitivePeerDependencies: - aws-crt + optional: true '@langchain/classic@1.0.27(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(cheerio@1.2.0)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: @@ -22124,69 +23556,7 @@ snapshots: - openai - ws - '@langchain/community@0.3.59(bde0b9db2f2a07fbe92f00b76fe0eadb)': - dependencies: - '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.58.2)(bufferutil@4.1.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(utf-8-validate@5.0.10)(zod@3.25.76) - '@ibm-cloud/watsonx-ai': 1.7.9 - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - '@langchain/openai': 0.5.18(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/weaviate': 0.2.3(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))) - binary-extensions: 2.3.0 - flat: 5.0.2 - ibm-cloud-sdk-core: 5.4.8 - js-yaml: 4.1.1 - langchain: 0.3.37(@langchain/aws@0.1.15(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))))(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(axios@1.19.0)(cheerio@1.2.0)(handlebars@4.7.9)(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - langsmith: 0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - math-expression-evaluator: 2.0.7 - openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) - uuid: 10.0.0 - zod: 3.25.76 - optionalDependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-bedrock-agent-runtime': 3.1003.0 - '@aws-sdk/client-bedrock-runtime': 3.1003.0 - '@aws-sdk/client-kendra': 3.1003.0 - '@aws-sdk/client-s3': 3.1003.0 - '@aws-sdk/credential-provider-node': 3.972.17 - '@browserbasehq/sdk': 2.7.0 - '@upstash/redis': 1.36.3 - cheerio: 1.2.0 - crypto-js: 4.2.0 - fast-xml-parser: 5.11.0 - google-auth-library: 9.15.1 - googleapis: 137.1.0 - html-to-text: 9.0.5 - ioredis: 5.10.0 - jsdom: 22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10) - jsonwebtoken: 9.0.3 - lodash: 4.17.23 - pg: 8.20.0 - playwright: 1.58.2 - redis: 4.7.1 - weaviate-client: 3.12.0 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - '@langchain/anthropic' - - '@langchain/aws' - - '@langchain/cerebras' - - '@langchain/cohere' - - '@langchain/deepseek' - - '@langchain/google-genai' - - '@langchain/google-vertexai' - - '@langchain/google-vertexai-web' - - '@langchain/groq' - - '@langchain/mistralai' - - '@langchain/ollama' - - '@langchain/xai' - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - axios - - encoding - - handlebars - - peggy - - '@langchain/community@1.1.27(877e75223018bd2be751ee722fb15fb5)': + '@langchain/community@1.1.27(66046857593e81cf94589e5d63e1e984)': dependencies: '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.58.2)(bufferutil@4.1.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(utf-8-validate@5.0.10)(zod@3.25.76) '@ibm-cloud/watsonx-ai': 1.7.9 @@ -22207,21 +23577,26 @@ snapshots: '@aws-sdk/client-s3': 3.1003.0 '@aws-sdk/credential-provider-node': 3.972.17 '@browserbasehq/sdk': 2.7.0 + '@smithy/eventstream-codec': 4.2.11 + '@smithy/protocol-http': 5.3.11 + '@smithy/signature-v4': 5.3.11 + '@smithy/util-utf8': 4.2.2 '@upstash/redis': 1.36.3 cheerio: 1.2.0 crypto-js: 4.2.0 + d3-dsv: 3.0.1 fast-xml-parser: 5.11.0 google-auth-library: 9.15.1 googleapis: 137.1.0 html-to-text: 9.0.5 + ignore: 7.0.5 ioredis: 5.10.0 jsdom: 22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10) jsonwebtoken: 9.0.3 lodash: 4.17.23 - pg: 8.20.0 + pg: 8.23.0 playwright: 1.58.2 redis: 4.7.1 - weaviate-client: 3.12.0 ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@opentelemetry/api' @@ -22229,58 +23604,34 @@ snapshots: - '@opentelemetry/sdk-trace-base' - peggy - '@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))': - dependencies: - '@cfworker/json-schema': 4.1.1 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.21 - langsmith: 0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - transitivePeerDependencies: - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - openai - - '@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))': + '@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: '@cfworker/json-schema': 4.1.1 + '@standard-schema/spec': 1.1.0 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) mustache: 4.2.0 p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 + uuid: 11.1.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - openai + - ws - '@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: '@cfworker/json-schema': 4.1.1 '@standard-schema/spec': 1.1.0 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 js-tiktoken: 1.0.21 - langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) mustache: 4.2.0 p-queue: 6.6.2 - uuid: 11.1.0 zod: 3.25.76 transitivePeerDependencies: - '@opentelemetry/api' @@ -22289,47 +23640,60 @@ snapshots: - openai - ws - '@langchain/google-common@0.1.8(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(zod@3.25.76)': + '@langchain/google-common@0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76)': dependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) uuid: 10.0.0 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - zod + optional: true - '@langchain/google-gauth@0.1.8(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(zod@3.25.76)': + '@langchain/google-gauth@0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76)': dependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - '@langchain/google-common': 0.1.8(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(zod@3.25.76) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/google-common': 0.1.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(zod@3.25.76) google-auth-library: 8.9.0 transitivePeerDependencies: - encoding - supports-color - zod + optional: true '@langchain/langgraph-checkpoint@1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) uuid: 10.0.0 - '@langchain/langgraph-sdk@0.0.70(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react@19.2.4)': + '@langchain/langgraph-checkpoint@1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + optional: true + + '@langchain/langgraph-checkpoint@1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': + dependencies: + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + + '@langchain/langgraph-sdk@1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/protocol': 0.0.19 '@types/json-schema': 7.0.15 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 9.0.1 + p-queue: 9.1.2 + p-retry: 7.1.1 optionalDependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optional: true - '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@langchain/langgraph-sdk@1.11.0(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/protocol': 0.0.19 '@types/json-schema': 7.0.15 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 9.0.1 + p-queue: 9.1.2 + p-retry: 7.1.1 optionalDependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -22344,7 +23708,18 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@langchain/langgraph@1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76)': + '@langchain/langgraph-sdk@1.8.8(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@types/json-schema': 7.0.15 + p-queue: 9.1.2 + p-retry: 7.1.1 + uuid: 13.0.0 + optionalDependencies: + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@langchain/langgraph@1.2.8(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod-to-json-schema@3.25.2(zod@3.25.76))(zod@3.25.76)': dependencies: '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) @@ -22353,32 +23728,37 @@ snapshots: uuid: 10.0.0 zod: 3.25.76 optionalDependencies: - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - react - react-dom - svelte - vue - '@langchain/openai@0.4.9(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/langgraph@1.4.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - js-tiktoken: 1.0.21 - openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/protocol': 0.0.19 + '@standard-schema/spec': 1.1.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - - encoding - - ws + - react + - react-dom + optional: true - '@langchain/openai@0.5.18(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + '@langchain/langgraph@1.4.15(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - js-tiktoken: 1.0.21 - openai: 5.23.2(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + '@langchain/langgraph-sdk': 1.11.0(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@langchain/protocol': 0.0.19 + '@standard-schema/spec': 1.1.0 zod: 3.25.76 transitivePeerDependencies: - - ws + - react + - react-dom '@langchain/openai@1.4.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': dependencies: @@ -22398,29 +23778,18 @@ snapshots: transitivePeerDependencies: - ws + '@langchain/protocol@0.0.19': {} + '@langchain/tavily@1.2.0(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) zod: 3.25.76 - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))': - dependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - js-tiktoken: 1.0.21 - '@langchain/textsplitters@1.0.1(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))': dependencies: '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) js-tiktoken: 1.0.21 - '@langchain/weaviate@0.2.3(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))': - dependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - uuid: 10.0.0 - weaviate-client: 3.12.0 - transitivePeerDependencies: - - encoding - '@ledgerhq/devices@8.10.0': dependencies: '@ledgerhq/errors': 6.29.0 @@ -22527,7 +23896,7 @@ snapshots: json-schema: 0.4.0 rxjs: 7.8.1 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - '@hono/arktype-validator' - '@hono/effect-validator' @@ -22591,7 +23960,7 @@ snapshots: sift: 17.1.3 xstate: 5.28.0 zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) transitivePeerDependencies: - '@hono/arktype-validator' - '@hono/effect-validator' @@ -22609,123 +23978,137 @@ snapshots: - valibot - zod-openapi - '@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@a2a-js/sdk': 0.2.5 - '@ai-sdk/provider-utils-v5': '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)' - '@ai-sdk/provider-utils-v6': '@ai-sdk/provider-utils@4.0.0(zod@3.25.76)' - '@ai-sdk/provider-v5': '@ai-sdk/provider@2.0.1' - '@ai-sdk/provider-v6': '@ai-sdk/provider@3.0.5' - '@ai-sdk/ui-utils-v5': '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)' - '@isaacs/ttlcache': 2.1.4 + '@a2a-js/sdk-v0_3': '@a2a-js/sdk@0.3.14(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)' + '@a2a-js/sdk-v1': '@a2a-js/sdk@1.0.1(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(express@5.2.1)' + '@ai-sdk/provider-utils-v6': '@ai-sdk/provider-utils@4.0.40(zod@3.25.76)' + '@ai-sdk/provider-utils-v7': '@ai-sdk/provider-utils@5.0.13(zod@3.25.76)' + '@ai-sdk/provider-v5': '@ai-sdk/provider@2.0.3' + '@ai-sdk/provider-v6': '@ai-sdk/provider@3.0.14' + '@ai-sdk/provider-v7': '@ai-sdk/provider@4.0.4' + '@isaacs/ttlcache': 2.1.5 '@lukeed/uuid': 2.0.1 - '@mastra/schema-compat': 1.2.7(zod@3.25.76) - '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@mastra/schema-compat': 1.3.10(zod@3.25.76) + '@modelcontextprotocol/server': 2.0.0 '@sindresorhus/slugify': 2.2.1 '@standard-schema/spec': 1.1.0 - ajv: 8.18.0 + ajv: 8.20.0 + chat: 4.40.0(ai@4.3.19(react@19.2.4)(zod@3.25.76))(zod@3.25.76) + croner: 10.0.1 dotenv: 17.4.0 execa: 9.6.1 + fastq: 1.20.1 gray-matter: 4.0.3 - hono: 4.12.10 - hono-openapi: 1.3.0(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(hono@4.12.10)(openapi-types@12.1.3) ignore: 7.0.5 - js-tiktoken: 1.0.21 + jpeg-js: 0.4.4 json-schema: 0.4.0 - lru-cache: 11.2.7 + lru-cache: 11.3.5 p-map: 7.0.4 p-retry: 7.1.1 - picomatch: 4.0.3 - radash: 12.1.1 + picomatch: 4.0.5 + posthog-node: 5.52.4(rxjs@7.8.2) tokenx: 1.3.0 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) xxhash-wasm: 1.1.0 zod: 3.25.76 transitivePeerDependencies: - - '@cfworker/json-schema' - - '@hono/standard-validator' - - '@standard-community/standard-json' - - '@standard-community/standard-openapi' - - '@types/json-schema' + - '@bufbuild/protobuf' + - '@grpc/grpc-js' + - ai - bufferutil - - openapi-types + - express + - rxjs - supports-color - utf-8-validate - - '@mastra/deployer@1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76)': - dependencies: - '@babel/core': 7.29.0 - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@mastra/server': 1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - '@optimize-lodash/rollup-plugin': 5.1.0(rollup@4.59.0) - '@rollup/plugin-alias': 6.0.0(rollup@4.59.0) - '@rollup/plugin-commonjs': 29.0.2(rollup@4.59.0) - '@rollup/plugin-esm-shim': 0.1.8(rollup@4.59.0) - '@rollup/plugin-json': 6.1.0(rollup@4.59.0) - '@rollup/plugin-node-resolve': 16.0.3(rollup@4.59.0) - '@rollup/plugin-virtual': 3.0.2(rollup@4.59.0) + - workflow + + '@mastra/deployer@1.67.0(@hono/node-server@1.19.11(hono@4.12.10))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@babel/core': 8.0.5 + '@babel/preset-typescript': 8.0.1(@babel/core@8.0.5) + '@babel/traverse': 8.0.5 + '@hono/node-ws': 1.3.1(@hono/node-server@1.19.11(hono@4.12.10))(bufferutil@4.1.0)(hono@4.12.10)(utf-8-validate@5.0.10) + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/server': 1.67.0(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + '@optimize-lodash/rollup-plugin': 5.1.0(rollup@4.63.3) + '@rollup/plugin-commonjs': 29.0.2(rollup@4.63.3) + '@rollup/plugin-esm-shim': 0.1.8(rollup@4.63.3) + '@rollup/plugin-json': 6.1.0(rollup@4.63.3) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.63.3) + '@rollup/plugin-virtual': 3.0.2(rollup@4.63.3) '@sindresorhus/slugify': 2.2.1 - '@types/babel__traverse': 7.28.0 empathic: 2.0.0 - esbuild: 0.27.7 + esbuild: 0.28.2 find-workspaces: 0.3.1 - fs-extra: 11.3.4 + fs-extra: 11.4.0 + gray-matter: 4.0.3 hono: 4.12.10 local-pkg: 1.1.2 - resolve-from: 5.0.0 resolve.exports: 2.0.3 - rollup: 4.59.0 - rollup-plugin-esbuild: 6.2.1(esbuild@0.27.7)(rollup@4.59.0) + rollup: 4.63.3 + rollup-plugin-esbuild: 6.2.1(esbuild@0.28.2)(rollup@4.63.3) strip-json-comments: 5.0.3 - tinyglobby: 0.2.15 - typescript-paths: 1.5.1(typescript@5.5.4) - zod: 3.25.76 + tinyglobby: 0.2.17 + typescript-paths: 1.5.2(typescript@5.5.4) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + yaml: 2.9.1 transitivePeerDependencies: + - '@hono/node-server' + - bufferutil - supports-color - typescript + - utf-8-validate + - zod - '@mastra/loggers@1.1.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@mastra/loggers@1.3.2(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) pino: 10.3.1 pino-pretty: 13.1.3 - '@mastra/mcp@1.4.1(@cfworker/json-schema@4.1.1)(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(@types/json-schema@7.0.15)(zod@3.25.76)': + '@mastra/mcp@1.18.0(@cfworker/json-schema@4.1.1)(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(express@5.2.1)(hono@4.12.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': dependencies: - '@apidevtools/json-schema-ref-parser': 14.2.1(@types/json-schema@7.0.15) - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@modelcontextprotocol/client': 2.0.0 + '@modelcontextprotocol/core': 2.0.0 + '@modelcontextprotocol/ext-apps': 1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@modelcontextprotocol/node': 2.0.0(@modelcontextprotocol/server@2.0.0)(hono@4.12.10) + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@modelcontextprotocol/server': 2.0.0 + '@modelcontextprotocol/server-legacy': 2.0.0(express@5.2.1) exit-hook: 5.1.0 fast-deep-equal: 3.1.3 - uuid: 13.0.0 - zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' - - '@types/json-schema' + - express + - hono + - react + - react-dom - supports-color + - zod - '@mastra/memory@1.13.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + '@mastra/memory@1.30.0(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@mastra/schema-compat': 1.2.7(zod@3.25.76) + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/schema-compat': 1.3.10(zod@4.6.5) async-mutex: 0.5.0 - image-size: 2.0.2 + diff: 8.0.4 json-schema: 0.4.0 - lru-cache: 11.2.7 + lru-cache: 11.3.5 probe-image-size: 7.2.3 tokenx: 1.3.0 xxhash-wasm: 1.1.0 - zod: 3.25.76 + zod: 4.6.5 transitivePeerDependencies: - supports-color - '@mastra/pg@1.8.5(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@mastra/pg@1.25.0(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) async-mutex: 0.5.0 - pg: 8.20.0 + pg: 8.23.0 + pg-connection-string: 2.12.0 xxhash-wasm: 1.1.0 transitivePeerDependencies: - pg-native @@ -22737,22 +24120,30 @@ snapshots: zod: 3.25.76 zod-from-json-schema: 0.5.2 zod-from-json-schema-v3: zod-from-json-schema@0.0.5 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.2(zod@3.25.76) - '@mastra/schema-compat@1.2.7(zod@3.25.76)': + '@mastra/schema-compat@1.3.10(zod@3.25.76)': dependencies: json-schema-to-zod: 2.7.0 zod: 3.25.76 zod-from-json-schema: 0.5.2 - zod-from-json-schema-v3: zod-from-json-schema@0.0.5 - zod-to-json-schema: 3.25.1(zod@3.25.76) - '@mastra/server@1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + '@mastra/schema-compat@1.3.10(zod@4.6.5)': dependencies: - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) + json-schema-to-zod: 2.7.0 + zod: 4.6.5 + zod-from-json-schema: 0.5.2 + + '@mastra/server@1.67.0(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + dependencies: + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) hono: 4.12.10 zod: 3.25.76 + '@mermaid-js/parser@1.2.1': + dependencies: + '@chevrotain/types': 11.1.2 + '@meronex/icons@4.0.0(react@19.2.4)': dependencies: camelcase: 5.3.1 @@ -22761,6 +24152,36 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} + '@modelcontextprotocol/client@2.0.0': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + jose: 6.2.0 + pkce-challenge: 5.0.1 + zod: 4.3.6 + + '@modelcontextprotocol/core@2.0.0': + dependencies: + zod: 4.3.6 + + '@modelcontextprotocol/ext-apps@1.7.5(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76)': + dependencies: + '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76) + '@standard-schema/spec': 1.1.0 + zod: 3.25.76 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@modelcontextprotocol/node@2.0.0(@modelcontextprotocol/server@2.0.0)(hono@4.12.10)': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.10) + '@modelcontextprotocol/server': 2.0.0 + optionalDependencies: + hono: 4.12.10 + '@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.11(hono@4.12.5) @@ -22785,6 +24206,47 @@ snapshots: transitivePeerDependencies: - supports-color + '@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.11(hono@4.12.10) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.2.1 + express-rate-limit: 8.3.0(express@5.2.1) + hono: 4.12.10 + jose: 6.2.12 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + '@cfworker/json-schema': 4.1.1 + transitivePeerDependencies: + - supports-color + + '@modelcontextprotocol/server-legacy@2.0.0(express@5.2.1)': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + content-type: 1.0.5 + cors: 2.8.6 + express-rate-limit: 8.3.0(express@5.2.1) + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.3.6 + optionalDependencies: + express: 5.2.1 + + '@modelcontextprotocol/server@2.0.0': + dependencies: + '@modelcontextprotocol/core': 2.0.0 + zod: 4.3.6 + '@mole-inc/bin-wrapper@8.0.1': dependencies: bin-check: 4.1.0 @@ -22922,6 +24384,9 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + '@napi-rs/nice-android-arm-eabi@1.1.1': optional: true @@ -23016,7 +24481,7 @@ snapshots: axios: 1.19.0(debug@4.4.3) rxjs: 7.8.2 - '@nestjs/cli@11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.27.7)(prettier@2.8.8)': + '@nestjs/cli@11.0.21(@swc/cli@0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3))(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(esbuild@0.28.2)(prettier@2.8.8)': dependencies: '@angular-devkit/core': 19.2.24(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3) @@ -23027,14 +24492,14 @@ snapshots: chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) glob: 13.0.6 node-emoji: 1.11.0 ora: 5.4.1 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 5.9.3 - webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/cli': 0.3.14(@swc/core@1.5.7(@swc/helpers@0.5.13))(chokidar@4.0.3) @@ -24366,11 +25831,11 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@optimize-lodash/rollup-plugin@5.1.0(rollup@4.59.0)': + '@optimize-lodash/rollup-plugin@5.1.0(rollup@4.63.3)': dependencies: '@optimize-lodash/transform': 3.0.6 - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - rollup: 4.59.0 + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) + rollup: 4.63.3 '@optimize-lodash/transform@3.0.6': dependencies: @@ -24423,7 +25888,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -24505,7 +25970,7 @@ snapshots: dependencies: playwright: 1.58.2 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.10.0)(type-fest@4.41.0)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.48.0 @@ -24515,7 +25980,7 @@ snapshots: react-refresh: 0.10.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) optionalDependencies: type-fest: 4.41.0 @@ -24527,13 +25992,15 @@ snapshots: dependencies: cross-spawn: 7.0.6 - '@posthog/core@1.7.1': + '@posthog/core@1.54.2': dependencies: - cross-spawn: 7.0.6 + '@posthog/types': 1.412.1 '@posthog/types@1.359.1': {} - '@postiz/wallets@0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@posthog/types@1.412.1': {} + + '@postiz/wallets@0.0.1(@babel/runtime@7.28.6)(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bs58@6.0.0)(bufferutil@4.1.0)(ioredis@5.10.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@solana/wallet-adapter-alpha': 0.1.14(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) @@ -24568,7 +26035,7 @@ snapshots: '@solana/wallet-adapter-torus': 0.11.32(@babel/runtime@7.28.6)(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) '@solana/wallet-adapter-trust': 0.1.17(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-unsafe-burner': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-walletconnect': 0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@solana/wallet-adapter-walletconnect': 0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@solana/wallet-adapter-xdefi': 0.1.11(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -24604,6 +26071,8 @@ snapshots: - utf-8-validate - zod + '@preact/signals-core@1.14.4': {} + '@prisma/client@6.5.0(prisma@6.5.0(typescript@5.5.4))(typescript@5.5.4)': optionalDependencies: prisma: 6.5.0(typescript@5.5.4) @@ -24685,6 +26154,29 @@ snapshots: '@radix-ui/primitive@1.1.3': {} + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-compose-refs@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24696,6 +26188,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-context@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24707,6 +26205,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-context@1.2.2(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-dialog@1.0.0(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24756,6 +26260,12 @@ snapshots: '@babel/runtime': 7.28.6 react: 19.2.4 + '@radix-ui/react-direction@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-dismissable-layer@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24780,6 +26290,34 @@ snapshots: '@types/react': 19.1.8 '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-dropdown-menu@2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-menu': 2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-focus-guards@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24791,6 +26329,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-focus-scope@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24800,6 +26344,17 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.2.4) @@ -24824,6 +26379,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-id@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-label@2.1.8(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -24833,6 +26395,50 @@ snapshots: '@types/react': 19.1.8 '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-menu@2.1.24(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-direction': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.1.8)(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-popper@1.3.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/rect': 1.1.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-portal@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24840,6 +26446,16 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -24858,6 +26474,15 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.2.4) @@ -24882,6 +26507,15 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.2.4) @@ -24900,6 +26534,25 @@ snapshots: '@types/react': 19.1.8 '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-direction': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-scroll-area@1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24950,6 +26603,34 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-slot@1.3.3(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-tooltip@1.2.16(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-context': 1.2.2(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.3.3(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-use-callback-ref@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24961,6 +26642,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-controllable-state@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24975,6 +26662,15 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.1.8)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.2.4)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.2.4) @@ -24982,6 +26678,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-escape-keydown@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -24995,6 +26698,12 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + '@radix-ui/react-use-layout-effect@1.0.0(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 @@ -25006,6 +26715,37 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-rect@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/rect': 1.1.3 + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-use-size@1.1.4(@types/react@19.1.8)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.1.8)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/rect@1.1.3': {} + '@react-aria/focus@3.21.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@react-aria/interactions': 3.27.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25056,17 +26796,17 @@ snapshots: react-dom: 19.2.4(react@19.2.4) react-promise-suspense: 0.3.4 - '@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))': + '@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))': dependencies: merge-options: 3.0.4 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + react-native: 0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) optional: true '@react-native/assets-registry@0.84.1': {} - '@react-native/codegen@0.84.1(@babel/core@7.29.0)': + '@react-native/codegen@0.84.1(@babel/core@8.0.5)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 8.0.5 '@babel/parser': 7.29.0 hermes-parser: 0.32.0 invariant: 2.2.4 @@ -25123,12 +26863,12 @@ snapshots: '@react-native/normalize-colors@0.84.1': {} - '@react-native/virtualized-lists@0.84.1(@types/react@19.1.8)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)': + '@react-native/virtualized-lists@0.84.1(@types/react@19.1.8)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.4 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + react-native: 0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) optionalDependencies: '@types/react': 19.1.8 @@ -25173,6 +26913,8 @@ snapshots: '@remirror/core-constants@3.0.0': {} + '@remix-run/node-fetch-server@0.13.3': {} + '@reown/appkit-common@1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: big.js: 6.2.2 @@ -25195,11 +26937,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-controllers@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.1.8)(react@19.2.4) viem: 2.47.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -25234,12 +26976,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) lit: 3.1.0 transitivePeerDependencies: @@ -25271,10 +27013,10 @@ snapshots: - valtio - zod - '@reown/appkit-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-ui@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) lit: 3.1.0 qrcode: 1.5.3 @@ -25306,14 +27048,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': + '@reown/appkit-utils@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.2 '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@19.1.8)(react@19.2.4) viem: 2.47.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: @@ -25355,17 +27097,17 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit@1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@reown/appkit-common': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.7.2 - '@reown/appkit-scaffold-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) - '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-ui': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.1.8)(react@19.2.4))(zod@3.25.76) '@reown/appkit-wallet': 1.7.2(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/universal-provider': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.1.8)(react@19.2.4) viem: 2.47.0(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -25443,144 +27185,223 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} - '@rollup/plugin-alias@6.0.0(rollup@4.59.0)': - optionalDependencies: - rollup: 4.59.0 - '@rollup/plugin-commonjs@28.0.1(rollup@4.59.0)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.59.0) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.59.0 - '@rollup/plugin-commonjs@29.0.2(rollup@4.59.0)': + '@rollup/plugin-commonjs@29.0.2(rollup@4.63.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-esm-shim@0.1.8(rollup@4.59.0)': + '@rollup/plugin-esm-shim@0.1.8(rollup@4.63.3)': dependencies: magic-string: 0.30.21 mlly: 1.8.1 optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-json@6.1.0(rollup@4.59.0)': + '@rollup/plugin-json@6.1.0(rollup@4.63.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.59.0)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.63.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.63.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 - '@rollup/plugin-virtual@3.0.2(rollup@4.59.0)': + '@rollup/plugin-virtual@3.0.2(rollup@4.63.3)': optionalDependencies: - rollup: 4.59.0 + rollup: 4.63.3 '@rollup/pluginutils@5.3.0(rollup@4.59.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.59.0 + '@rollup/pluginutils@5.3.0(rollup@4.63.3)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.5 + optionalDependencies: + rollup: 4.63.3 + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true + '@rollup/rollup-android-arm-eabi@4.63.3': + optional: true + '@rollup/rollup-android-arm64@4.59.0': optional: true + '@rollup/rollup-android-arm64@4.63.3': + optional: true + '@rollup/rollup-darwin-arm64@4.59.0': optional: true + '@rollup/rollup-darwin-arm64@4.63.3': + optional: true + '@rollup/rollup-darwin-x64@4.59.0': optional: true + '@rollup/rollup-darwin-x64@4.63.3': + optional: true + '@rollup/rollup-freebsd-arm64@4.59.0': optional: true + '@rollup/rollup-freebsd-arm64@4.63.3': + optional: true + '@rollup/rollup-freebsd-x64@4.59.0': optional: true + '@rollup/rollup-freebsd-x64@4.63.3': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.59.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.63.3': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.59.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.63.3': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-arm64-musl@4.59.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-loong64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-loong64-musl@4.59.0': optional: true + '@rollup/rollup-linux-loong64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-ppc64-musl@4.59.0': optional: true + '@rollup/rollup-linux-ppc64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.59.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.63.3': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.59.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-x64-gnu@4.59.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.63.3': + optional: true + '@rollup/rollup-linux-x64-musl@4.59.0': optional: true + '@rollup/rollup-linux-x64-musl@4.63.3': + optional: true + '@rollup/rollup-openbsd-x64@4.59.0': optional: true + '@rollup/rollup-openbsd-x64@4.63.3': + optional: true + '@rollup/rollup-openharmony-arm64@4.59.0': optional: true + '@rollup/rollup-openharmony-arm64@4.63.3': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.59.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.63.3': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.59.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.63.3': + optional: true + '@rollup/rollup-win32-x64-gnu@4.59.0': optional: true + '@rollup/rollup-win32-x64-gnu@4.63.3': + optional: true + '@rollup/rollup-win32-x64-msvc@4.59.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.63.3': + optional: true + '@rtsao/scc@1.1.0': {} '@scarf/scarf@1.4.0': {} @@ -25771,7 +27592,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@sentry/nextjs@10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7))': + '@sentry/nextjs@10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 @@ -25783,8 +27604,8 @@ snapshots: '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) '@sentry/react': 10.45.0(react@19.2.4) '@sentry/vercel-edge': 10.45.0 - '@sentry/webpack-plugin': 5.1.1(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) - next: 16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + '@sentry/webpack-plugin': 5.1.1(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) + next: 16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) rollup: 4.59.0 stacktrace-parser: 0.1.11 transitivePeerDependencies: @@ -25879,15 +27700,48 @@ snapshots: '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) '@sentry/core': 10.45.0 - '@sentry/webpack-plugin@5.1.1(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7))': + '@sentry/webpack-plugin@5.1.1(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2))': dependencies: '@sentry/bundler-plugin-core': 5.1.1 uuid: 9.0.1 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) transitivePeerDependencies: - encoding - supports-color + '@shikijs/core@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + '@sinclair/typebox@0.27.10': {} '@sindresorhus/is@4.6.0': {} @@ -25911,6 +27765,74 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@slack/bolt@4.7.3(@types/express@4.17.25)(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@slack/logger': 4.0.1 + '@slack/oauth': 3.0.5 + '@slack/socket-mode': 2.0.7(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@slack/types': 2.22.0 + '@slack/web-api': 7.19.0 + '@types/express': 4.17.25 + axios: 1.19.0(debug@4.4.3) + express: 5.2.1 + path-to-regexp: 8.4.2 + raw-body: 3.0.2 + tsscmp: 1.0.6 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@slack/logger@4.0.1': + dependencies: + '@types/node': 18.16.9 + + '@slack/oauth@3.0.5': + dependencies: + '@slack/logger': 4.0.1 + '@slack/web-api': 7.19.0 + '@types/jsonwebtoken': 9.0.10 + '@types/node': 18.16.9 + jsonwebtoken: 9.0.3 + transitivePeerDependencies: + - debug + - supports-color + + '@slack/socket-mode@2.0.7(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@slack/logger': 4.0.1 + '@slack/web-api': 7.19.0 + '@types/node': 18.16.9 + '@types/ws': 8.18.1 + eventemitter3: 5.0.4 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@slack/types@2.22.0': {} + + '@slack/web-api@7.19.0': + dependencies: + '@slack/logger': 4.0.1 + '@slack/types': 2.22.0 + '@types/node': 18.16.9 + '@types/retry': 0.12.0 + axios: 1.19.0(debug@4.4.3) + eventemitter3: 5.0.4 + form-data: 4.0.6 + is-electron: 2.2.2 + is-stream: 2.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + retry: 0.13.1 + transitivePeerDependencies: + - debug + - supports-color + '@smithy/abort-controller@4.2.11': dependencies: '@smithy/types': 4.18.0 @@ -26255,9 +28177,9 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': + '@solana-mobile/mobile-wallet-adapter-protocol-web3js@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) bs58: 5.0.0 js-base64: 3.7.8 @@ -26268,14 +28190,14 @@ snapshots: - react-native - typescript - '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': dependencies: '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.5.4) '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4) '@solana/wallet-standard-util': 1.1.2 '@wallet-standard/core': 1.1.1 js-base64: 3.7.8 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + react-native: 0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@solana/wallet-adapter-base' - '@solana/web3.js' @@ -26284,25 +28206,25 @@ snapshots: - react - typescript - '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': + '@solana-mobile/wallet-adapter-mobile@2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) - '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana-mobile/mobile-wallet-adapter-protocol-web3js': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-standard-features': 1.3.0 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) js-base64: 3.7.8 optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - react - react-native - typescript - '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': + '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 '@wallet-standard/base': 1.1.0 @@ -26374,9 +28296,9 @@ snapshots: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-base-ui@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': + '@solana/wallet-adapter-base-ui@0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': dependencies: - '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) react: 19.2.4 transitivePeerDependencies: @@ -26510,11 +28432,11 @@ snapshots: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-react-ui@0.9.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': + '@solana/wallet-adapter-react-ui@0.9.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@solana/wallet-adapter-base-ui': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) - '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana/wallet-adapter-base-ui': 0.1.6(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana/wallet-adapter-react': 0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -26524,9 +28446,9 @@ snapshots: - react-native - typescript - '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': + '@solana/wallet-adapter-react@0.15.39(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4)': dependencies: - '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) + '@solana-mobile/wallet-adapter-mobile': 2.2.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.2.4) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) @@ -26618,11 +28540,11 @@ snapshots: '@solana/wallet-standard-util': 1.1.2 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@solana/wallet-adapter-walletconnect@0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@solana/wallet-adapter-walletconnect@0.1.21(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/solana-adapter': 0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/solana-adapter': 0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -26784,23 +28706,6 @@ snapshots: eventemitter3: 5.0.4 uuid: 9.0.1 - '@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76)': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/json-schema': 7.0.15 - quansync: 0.2.11 - optionalDependencies: - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - - '@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76)': - 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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76) - '@standard-schema/spec': 1.1.0 - openapi-types: 12.1.3 - optionalDependencies: - zod: 3.25.76 - '@standard-schema/spec@1.1.0': {} '@stripe/react-stripe-js@5.6.1(@stripe/stripe-js@8.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': @@ -27086,12 +28991,19 @@ snapshots: postcss: 8.5.26 tailwindcss: 4.2.1 - '@tailwindcss/vite@4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.1(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) + + '@tanstack/devtools-event-client@0.4.4': {} + + '@tanstack/pacer@0.20.1': + dependencies: + '@tanstack/devtools-event-client': 0.4.4 + '@tanstack/store': 0.9.3 '@tanstack/react-virtual@3.13.21(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -27099,6 +29011,8 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + '@tanstack/store@0.9.3': {} + '@tanstack/virtual-core@3.13.21': {} '@temporalio/activity@1.15.0': @@ -27142,7 +29056,7 @@ snapshots: long: 5.3.2 protobufjs: 7.5.4 - '@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1)': + '@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1)': dependencies: '@grpc/grpc-js': 1.14.3 '@swc/core': 1.5.7(@swc/helpers@0.5.13) @@ -27161,11 +29075,11 @@ snapshots: protobufjs: 7.5.4 rxjs: 7.8.2 source-map: 0.7.6 - source-map-loader: 4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + source-map-loader: 4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) supports-color: 8.1.1 - swc-loader: 0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + swc-loader: 0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) unionfs: 4.6.0 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) transitivePeerDependencies: - '@swc/helpers' - esbuild @@ -27598,6 +29512,123 @@ snapshots: dependencies: '@types/node': 18.16.9 + '@types/d3-array@3.2.2': {} + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-chord@3.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + + '@types/d3-delaunay@6.0.4': {} + + '@types/d3-dispatch@3.0.7': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-dsv@3.0.7': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + + '@types/d3-force@3.0.10': {} + + '@types/d3-format@3.0.4': {} + + '@types/d3-geo@3.1.1': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/d3-hierarchy@3.1.7': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-polygon@3.0.2': {} + + '@types/d3-quadtree@3.0.6': {} + + '@types/d3-random@3.0.4': {} + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-selection@3.0.12': {} + + '@types/d3-shape@3.2.0': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time-format@4.0.3': {} + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.12 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.12 + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.1 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.12 + '@types/d3-shape': 3.2.0 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -27626,6 +29657,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/express-serve-static-core@4.19.8': dependencies: '@types/node': 18.16.9 @@ -27661,6 +29694,10 @@ snapshots: '@types/filewriter@0.0.33': {} + '@types/gensync@1.0.5': {} + + '@types/geojson@7946.0.16': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 18.16.9 @@ -27702,6 +29739,8 @@ snapshots: '@types/tough-cookie': 4.0.5 parse5: 7.3.0 + '@types/jsesc@2.5.1': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -27771,7 +29810,7 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: '@types/node': 18.16.9 - form-data: 4.0.5 + form-data: 4.0.6 '@types/node-telegram-bot-api@0.64.14': dependencies: @@ -27813,7 +29852,7 @@ snapshots: '@types/pg@8.15.5': dependencies: '@types/node': 18.16.9 - pg-protocol: 1.13.0 + pg-protocol: 1.16.0 pg-types: 2.2.0 '@types/pg@8.15.6': @@ -28094,8 +30133,8 @@ snapshots: '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3(supports-color@5.5.0) minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 + semver: 7.8.5 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: @@ -28517,6 +30556,11 @@ snapshots: '@uppy/utils': 6.2.2 preact: 10.28.4 + '@upsetjs/venn.js@2.0.0': + optionalDependencies: + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + '@upstash/redis@1.36.3': dependencies: uncrypto: 0.1.3 @@ -28531,10 +30575,10 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) '@vitest/coverage-v8@1.6.0(vitest@3.1.4)': dependencies: @@ -28551,7 +30595,7 @@ snapshots: std-env: 3.10.0 strip-literal: 2.1.1 test-exclude: 6.0.0 - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - supports-color @@ -28562,13 +30606,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3))': + '@vitest/mocker@3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1))': dependencies: '@vitest/spy': 3.1.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) '@vitest/pretty-format@3.1.4': dependencies: @@ -28602,7 +30646,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.1.1 sirv: 2.0.4 - vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vitest: 3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) '@vitest/utils@1.6.0': dependencies: @@ -28644,21 +30688,21 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 events: 3.3.0 lodash.isequal: 4.5.0 @@ -28688,21 +30732,21 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -28783,13 +30827,13 @@ snapshots: - bufferutil - utf-8-validate - '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': + '@walletconnect/keyvaluestorage@1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': dependencies: '@walletconnect/safe-json': 1.0.2 idb-keyval: 6.2.2 unstorage: 1.17.4(@upstash/redis@1.36.3)(idb-keyval@6.2.2)(ioredis@5.10.0) optionalDependencies: - '@react-native-async-storage/async-storage': 1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) + '@react-native-async-storage/async-storage': 1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -28831,16 +30875,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -28867,16 +30911,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -28903,13 +30947,13 @@ snapshots: - utf-8-validate - zod - '@walletconnect/solana-adapter@0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/solana-adapter@0.0.8(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit': 1.7.2(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@types/react@19.1.8)(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(react@19.2.4)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)) '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -28943,12 +30987,12 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/types@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': + '@walletconnect/types@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -28972,12 +31016,12 @@ snapshots: - ioredis - uploadthing - '@walletconnect/types@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': + '@walletconnect/types@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -29001,18 +31045,18 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/sign-client': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 lodash: 4.17.21 transitivePeerDependencies: @@ -29041,18 +31085,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) - '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/sign-client': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/utils': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -29081,18 +31125,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/utils@2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/types': 2.19.0(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 detect-browser: 5.3.0 @@ -29125,18 +31169,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/utils@2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(bufferutil@4.1.0)(ioredis@5.10.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/keyvaluestorage': 1.1.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) + '@walletconnect/types': 2.19.1(@react-native-async-storage/async-storage@1.24.0(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)))(@upstash/redis@1.36.3)(ioredis@5.10.0) '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 @@ -29290,6 +31334,10 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 + '@workflow/serde@4.1.0': {} + + '@workflow/serde@4.1.0-beta.2': {} + '@wyw-in-js/processor-utils@0.5.5': dependencies: '@babel/generator': 7.29.1 @@ -29330,8 +31378,6 @@ snapshots: '@xtuc/long@4.2.2': {} - '@zeit/schemas@2.36.0': {} - abab@2.0.6: {} abbrev@1.1.1: {} @@ -29353,10 +31399,6 @@ snapshots: typescript: 5.5.4 zod: 3.25.76 - abort-controller-x@0.4.3: {} - - abort-controller-x@0.5.0: {} - abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -29435,6 +31477,14 @@ snapshots: '@opentelemetry/api': 1.9.0 zod: 3.25.76 + ai@6.0.285(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 3.0.196(zod@3.25.76) + '@ai-sdk/provider': 3.0.16 + '@ai-sdk/provider-utils': 4.0.51(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: ajv: 8.18.0 @@ -29443,6 +31493,10 @@ snapshots: optionalDependencies: ajv: 8.18.0 + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + ajv-keywords@3.5.2(ajv@6.14.0): dependencies: ajv: 6.14.0 @@ -29466,11 +31520,14 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - anser@1.4.10: {} - - ansi-align@3.0.1: + ajv@8.20.0: dependencies: - string-width: 4.2.3 + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + anser@1.4.10: {} ansi-colors@4.1.3: {} @@ -29509,6 +31566,22 @@ snapshots: arch@2.2.0: {} + archiver@8.0.0: + dependencies: + async: 3.2.6 + buffer-crc32: 1.0.0 + is-stream: 4.0.1 + lazystream: 1.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + readdir-glob: 3.0.0 + tar-stream: 3.2.1 + zip-stream: 7.0.5 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 @@ -29618,7 +31691,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrify@2.0.1: {} + arrify@2.0.1: + optional: true asap@2.0.6: {} @@ -29658,6 +31732,8 @@ snapshots: dependencies: tslib: 2.8.1 + async@3.2.6: {} + asynckit@0.4.0: {} atomic-sleep@1.0.0: {} @@ -29699,6 +31775,8 @@ snapshots: axobject-query@4.1.0: {} + b4a@1.9.0: {} + babel-jest@29.7.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -29712,6 +31790,19 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@29.7.0(@babel/core@8.0.5): + dependencies: + '@babel/core': 8.0.5 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@8.0.5) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + babel-merge@3.0.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -29788,18 +31879,72 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + babel-preset-current-node-syntax@1.2.0(@babel/core@8.0.5): + dependencies: + '@babel/core': 8.0.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@8.0.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@8.0.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@8.0.5) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@8.0.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@8.0.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@8.0.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@8.0.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@8.0.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@8.0.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@8.0.5) + babel-preset-jest@29.6.3(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + babel-preset-jest@29.6.3(@babel/core@8.0.5): + dependencies: + '@babel/core': 8.0.5 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@8.0.5) + bail@2.0.2: {} balanced-match@1.0.2: {} balanced-match@4.0.4: {} + bare-events@2.9.2: {} + + bare-fs@4.8.1: + dependencies: + bare-events: 2.9.2 + bare-path: 3.1.2 + bare-stream: 2.13.4(bare-events@2.9.2) + bare-url: 2.5.4 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-path@3.1.2: {} + + bare-stream@2.13.4(bare-events@2.9.2): + dependencies: + b4a: 1.9.0 + streamx: 2.28.1 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.2 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.5.4: + dependencies: + bare-path: 3.1.2 + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 @@ -29852,7 +31997,7 @@ snapshots: bin-version-check@5.1.0: dependencies: bin-version: 6.0.0 - semver: 7.7.4 + semver: 7.8.5 semver-truncate: 3.0.0 bin-version@6.0.0: @@ -29924,17 +32069,6 @@ snapshots: bowser@2.14.1: {} - boxen@7.0.0: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.6.2 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -30032,6 +32166,8 @@ snapshots: dependencies: node-int64: 0.4.0 + buffer-crc32@1.0.0: {} + buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} @@ -30119,8 +32255,6 @@ snapshots: camelcase@6.3.0: {} - camelcase@7.0.1: {} - caniuse-lite@1.0.30001777: {} canvas@2.11.2: @@ -30152,17 +32286,11 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chalk-template@0.4.0: - dependencies: - chalk: 4.1.2 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.0.1: {} - chalk@5.6.2: {} change-case@4.1.2: @@ -30184,16 +32312,10 @@ snapshots: character-entities-html4@2.1.0: {} - character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} - character-entities@2.0.2: {} - character-reference-invalid@1.1.4: {} - character-reference-invalid@2.0.1: {} chardet@2.1.1: {} @@ -30204,6 +32326,21 @@ snapshots: dependencies: '@kurkle/color': 0.3.4 + chat@4.40.0(ai@4.3.19(react@19.2.4)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@workflow/serde': 4.1.0-beta.2 + mdast-util-to-string: 4.0.0 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + remend: 1.3.1 + unified: 11.0.5 + optionalDependencies: + ai: 4.3.19(react@19.2.4)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + check-error@2.1.3: {} cheerio-select@2.1.0: @@ -30289,6 +32426,8 @@ snapshots: cjs-module-lexer@2.2.0: {} + clarinet@0.12.6: {} + class-transformer@0.5.1: {} class-validator-jsonschema@5.1.0(class-transformer@0.5.1)(class-validator@0.14.4): @@ -30311,14 +32450,16 @@ snapshots: dependencies: clsx: 1.2.1 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + classnames@2.3.1: {} classnames@2.5.1: {} clean-stack@2.2.0: {} - cli-boxes@3.0.0: {} - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -30335,12 +32476,6 @@ snapshots: client-only@0.0.1: {} - clipboardy@3.0.0: - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -30410,8 +32545,6 @@ snapshots: dependencies: delayed-stream: 1.0.0 - comma-separated-tokens@1.0.8: {} - comma-separated-tokens@2.0.3: {} commander@10.0.1: {} @@ -30443,6 +32576,14 @@ snapshots: component-emitter@2.0.0: {} + compress-commons@7.0.1: + dependencies: + crc-32: 1.2.2 + crc32-stream: 7.0.1 + is-stream: 4.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -30508,10 +32649,6 @@ snapshots: console-control-strings@1.1.0: {} - console-table-printer@2.15.0: - dependencies: - simple-wcswidth: 1.1.2 - console.table@0.10.0: dependencies: easy-table: 1.1.0 @@ -30580,6 +32717,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -30606,6 +32751,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 + crc-32@1.2.2: {} + + crc32-stream@7.0.1: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + crc@3.8.0: dependencies: buffer: 5.7.1 @@ -30656,6 +32808,8 @@ snapshots: '@types/luxon': 3.7.1 luxon: 3.7.2 + croner@10.0.1: {} + cropperjs@1.6.2: {} cross-env@10.1.0: @@ -30770,6 +32924,190 @@ snapshots: custom-error-instance@2.1.1: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.3): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.34.3 + + cytoscape-fcose@2.2.0(cytoscape@3.34.3): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.34.3 + + cytoscape@3.34.3: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.1.0 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.2: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.2 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.14: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.23 + damerau-levenshtein@1.0.8: {} dashdash@1.14.1: @@ -30819,12 +33157,16 @@ snapshots: date-fns@3.6.0: {} + date-fns@4.4.0: {} + dateformat@4.6.3: {} dayjs@1.11.13: {} dayjs@1.11.19: {} + dayjs@1.11.23: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -30884,8 +33226,6 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.20 - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@2.2.1: {} @@ -30918,6 +33258,10 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 + delaunator@5.1.0: + dependencies: + robust-predicates: 3.0.3 + delay@5.0.0: {} delayed-stream@1.0.0: {} @@ -30969,6 +33313,8 @@ snapshots: diff@5.2.2: {} + diff@8.0.4: {} + diffie-hellman@5.0.3: dependencies: bn.js: 4.12.3 @@ -31100,7 +33446,7 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.9 - semver: 7.7.4 + semver: 7.8.5 ee-first@1.1.1: {} @@ -31131,6 +33477,8 @@ snapshots: empathic@2.0.0: {} + empathic@2.0.1: {} + encode-utf8@1.0.3: {} encodeurl@1.0.2: {} @@ -31306,6 +33654,8 @@ snapshots: es-toolkit@1.33.0: {} + es-toolkit@1.52.0: {} + es6-promise@4.2.8: {} es6-promisify@5.0.0: @@ -31377,34 +33727,34 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 - esbuild@0.27.7: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} @@ -31745,10 +34095,18 @@ snapshots: eventemitter3@5.0.4: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.9.2 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} eventsource-parser@3.0.6: {} + eventsource-parser@3.1.1: {} + eventsource@3.0.7: dependencies: eventsource-parser: 3.0.6 @@ -31937,6 +34295,8 @@ snapshots: fast-equals@5.4.0: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -31965,19 +34325,20 @@ snapshots: fast-stable-stringify@1.0.0: {} - fast-string-truncated-width@1.2.1: {} + fast-string-truncated-width@3.0.3: {} - fast-string-width@1.1.0: + fast-string-width@3.0.2: dependencies: - fast-string-truncated-width: 1.2.1 + fast-string-truncated-width: 3.0.3 - fast-text-encoding@1.0.6: {} + fast-text-encoding@1.0.6: + optional: true fast-uri@3.1.0: {} - fast-wrap-ansi@0.1.6: + fast-wrap-ansi@0.2.2: dependencies: - fast-string-width: 1.1.0 + fast-string-width: 3.0.2 fast-xml-builder@1.0.0: {} @@ -32000,6 +34361,10 @@ snapshots: fast-xml-builder: 1.0.0 strnum: 2.2.0 + fastdom@1.0.12: + dependencies: + strictdom: 1.0.1 + fastestsmallesttextencoderdecoder@1.0.22: {} fastq@1.20.1: @@ -32016,13 +34381,9 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fetch-blob@3.2.0: dependencies: @@ -32159,7 +34520,7 @@ snapshots: dependencies: fast-glob: 3.3.3 pkg-types: 1.3.1 - yaml: 2.8.2 + yaml: 2.9.1 first-match@0.0.1: {} @@ -32210,7 +34571,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -32225,7 +34586,7 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.9.3 - webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) form-data-encoder@1.7.2: {} @@ -32360,6 +34721,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true gaxios@6.7.1: dependencies: @@ -32372,6 +34734,14 @@ snapshots: - encoding - supports-color + gaxios@7.3.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - supports-color + gcp-metadata@5.3.0: dependencies: gaxios: 5.1.3 @@ -32379,6 +34749,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true gcp-metadata@6.1.1: dependencies: @@ -32389,6 +34760,14 @@ snapshots: - encoding - supports-color + gcp-metadata@8.1.2: + dependencies: + gaxios: 7.3.1 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + generator-function@2.0.1: {} generic-pool@3.9.0: {} @@ -32397,6 +34776,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.7.0: {} + get-func-name@2.0.2: {} get-intrinsic@1.3.0: @@ -32526,6 +34907,17 @@ snapshots: globrex@0.1.2: {} + google-auth-library@10.9.1: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.3.1 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + google-auth-library@8.9.0: dependencies: arrify: 2.0.1 @@ -32540,6 +34932,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true google-auth-library@9.15.1: dependencies: @@ -32555,9 +34948,12 @@ snapshots: google-logging-utils@0.0.2: {} + google-logging-utils@1.1.3: {} + google-p12-pem@4.0.1: dependencies: node-forge: 1.3.3 + optional: true googleapis-common@7.2.0: dependencies: @@ -32606,14 +35002,6 @@ snapshots: graphql: 16.13.1 lodash.get: 4.4.2 - graphql-request@6.1.0(graphql@16.13.1): - dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.1) - cross-fetch: 3.2.0 - graphql: 16.13.1 - transitivePeerDependencies: - - encoding - graphql-scalars@1.25.0(graphql@16.13.1): dependencies: graphql: 16.13.1 @@ -32656,6 +35044,7 @@ snapshots: web-streams-polyfill: 3.3.3 transitivePeerDependencies: - encoding + optional: true gtoken@6.1.2: dependencies: @@ -32665,6 +35054,7 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + optional: true gtoken@7.1.0: dependencies: @@ -32686,6 +35076,8 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 + hachure-fill@0.5.2: {} + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -32770,6 +35162,19 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -32802,8 +35207,6 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hast-util-parse-selector@2.2.5: {} - hast-util-parse-selector@3.1.1: dependencies: '@types/hast': 2.3.10 @@ -32828,6 +35231,12 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + hast-util-select@6.0.4: dependencies: '@types/hast': 3.0.4 @@ -32894,19 +35303,20 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@2.0.1: {} hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 - hastscript@6.0.0: - dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 + hast@1.0.0: {} hastscript@7.2.0: dependencies: @@ -32977,15 +35387,6 @@ snapshots: hono: 4.12.10 zod: 3.25.76 - hono-openapi@1.3.0(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(hono@4.12.10)(openapi-types@12.1.3): - 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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76) - '@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76) - '@types/json-schema': 7.0.15 - openapi-types: 12.1.3 - optionalDependencies: - hono: 4.12.10 - hono@4.12.10: {} hono@4.12.5: {} @@ -33174,8 +35575,6 @@ snapshots: dependencies: queue: 6.0.2 - image-size@2.0.2: {} - image-to-pdf@3.0.2: dependencies: pdfkit: 0.15.2 @@ -33215,6 +35614,8 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -33243,6 +35644,10 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + internmap@1.0.1: {} + + internmap@2.0.3: {} + into-stream@6.0.0: dependencies: from2: 2.3.0 @@ -33272,15 +35677,8 @@ snapshots: iron-webcrypto@1.2.1: {} - is-alphabetical@1.0.4: {} - is-alphabetical@2.0.1: {} - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 @@ -33330,7 +35728,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 is-callable@1.2.7: {} @@ -33349,12 +35747,12 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-decimal@1.0.4: {} - is-decimal@2.0.1: {} is-docker@2.2.1: {} + is-electron@2.2.2: {} + is-extendable@0.1.1: {} is-extendable@1.0.1: @@ -33383,8 +35781,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-hexadecimal@1.0.4: {} - is-hexadecimal@2.0.1: {} is-hotkey@0.1.8: {} @@ -33428,8 +35824,6 @@ snapshots: is-plain-object@5.0.0: {} - is-port-reachable@4.0.0: {} - is-potential-custom-element-name@1.0.1: {} is-promise@4.0.0: {} @@ -33547,7 +35941,7 @@ snapshots: '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.4 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -33908,7 +36302,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.4 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -33974,10 +36368,14 @@ snapshots: jose@6.2.0: {} + jose@6.2.12: {} + joycon@3.1.1: {} jpeg-exif@1.1.4: {} + jpeg-js@0.4.4: {} + js-base64@2.6.4: {} js-base64@3.7.8: {} @@ -34000,6 +36398,8 @@ snapshots: dependencies: base64-js: 1.5.1 + js-tokens@10.0.0: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -34230,6 +36630,10 @@ snapshots: dependencies: commander: 8.3.0 + katex@0.16.47: + dependencies: + commander: 8.3.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -34240,6 +36644,8 @@ snapshots: keyvaluestorage-interface@1.0.0: {} + khroma@2.1.0: {} + kind-of@6.0.3: {} kleur@3.0.3: {} @@ -34248,61 +36654,51 @@ snapshots: konva@10.2.0: {} - langchain@0.3.37(@langchain/aws@0.1.15(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))))(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(axios@1.19.0)(cheerio@1.2.0)(handlebars@4.7.9)(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + langchain@1.5.11(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - '@langchain/openai': 0.5.18(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))) - js-tiktoken: 1.0.21 - js-yaml: 4.1.1 - jsonpointer: 5.0.1 - langsmith: 0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)) - openapi-types: 12.1.3 - p-retry: 4.6.2 - uuid: 10.0.0 - yaml: 2.8.2 + '@langchain/core': 1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph': 1.4.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) zod: 3.25.76 - optionalDependencies: - '@langchain/aws': 0.1.15(@langchain/core@1.1.39(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))) - axios: 1.19.0(debug@4.4.3) - cheerio: 1.2.0 - handlebars: 4.7.9 transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' - '@opentelemetry/sdk-trace-base' - openai + - react + - react-dom - ws + optional: true - langsmith@0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)): + langchain@1.5.11(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.15.0 - p-queue: 6.6.2 - semver: 7.7.4 - uuid: 10.0.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - openai: 4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + '@langchain/core': 1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@langchain/langgraph': 1.4.15(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) + '@langchain/langgraph-checkpoint': 1.1.5(@langchain/core@1.2.11(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))) + langsmith: 0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + zod: 3.25.76 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - react + - react-dom + - ws - langsmith@0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76)): + langsmith@0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - '@types/uuid': 10.0.0 - chalk: 4.1.2 - console-table-printer: 2.15.0 p-queue: 6.6.2 - semver: 7.7.4 uuid: 10.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - langsmith@0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + langsmith@0.5.17(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: p-queue: 6.6.2 uuid: 10.0.0 @@ -34311,7 +36707,7 @@ snapshots: '@opentelemetry/exporter-trace-otlp-proto': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) openai: 6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) language-subtag-registry@0.3.23: {} @@ -34323,6 +36719,14 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + layout-base@1.0.2: {} + + layout-base@2.0.1: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + leac@0.6.0: {} leven@3.1.0: {} @@ -34470,6 +36874,12 @@ snapshots: lit-element: 4.2.2 lit-html: 3.3.2 + lit@3.3.3: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + load-esm@1.0.3: {} load-tsconfig@0.2.5: {} @@ -34602,8 +37012,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.7: {} - lru-cache@11.3.5: {} lru-cache@4.1.5: @@ -34618,6 +37026,7 @@ snapshots: lru-cache@6.0.0: dependencies: yallist: 4.0.0 + optional: true lru-cache@7.18.3: {} @@ -34625,6 +37034,16 @@ snapshots: dependencies: react: 19.2.4 + lucide-react@0.525.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide-react@0.542.0(react@19.2.4): + dependencies: + react: 19.2.4 + + lucide@0.525.0: {} + luxon@3.7.2: {} lz-string@1.5.0: {} @@ -34649,7 +37068,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 make-error@1.3.6: {} @@ -34668,34 +37087,47 @@ snapshots: markdown-table@3.0.4: {} + marked@12.0.2: {} + + marked@16.4.2: {} + marky@1.3.0: {} - mastra@1.3.19(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76): + mastra@1.30.0(@hono/node-server@1.19.11(hono@4.12.10))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.1.0)(rxjs@7.8.2)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: - '@clack/prompts': 1.2.0 + '@babel/parser': 8.0.5 + '@babel/types': 8.0.5 + '@clack/prompts': 1.8.1 '@expo/devcert': 1.2.1 - '@mastra/core': 1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@mastra/deployer': 1.21.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76))(typescript@5.5.4)(zod@3.25.76) - '@mastra/loggers': 1.1.0(@mastra/core@1.21.0(@cfworker/json-schema@4.1.1)(@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@0.2.11)(zod-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@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-to-json-schema@3.25.1(zod@3.25.76))(zod@3.25.76))(@standard-schema/spec@1.1.0)(openapi-types@12.1.3)(zod@3.25.76))(@types/json-schema@7.0.15)(bufferutil@4.1.0)(openapi-types@12.1.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@mastra/core': 1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/deployer': 1.67.0(@hono/node-server@1.19.11(hono@4.12.10))(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76))(bufferutil@4.1.0)(typescript@5.5.4)(utf-8-validate@5.0.10)(zod@3.25.76) + '@mastra/loggers': 1.3.2(@mastra/core@1.67.0(@bufbuild/protobuf@2.11.0)(@grpc/grpc-js@1.14.3)(ai@4.3.19(react@19.2.4)(zod@3.25.76))(bufferutil@4.1.0)(express@5.2.1)(rxjs@7.8.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + archiver: 8.0.0 commander: 14.0.3 dotenv: 17.4.0 execa: 9.6.1 - fs-extra: 11.3.4 + fs-extra: 11.4.0 get-port: 7.1.0 local-pkg: 1.1.2 + openapi-fetch: 0.17.0 picocolors: 1.1.1 - posthog-node: 5.17.2 - prettier: 3.8.1 - semver: 7.7.4 - serve: 14.2.6 + posthog-node: 5.52.4(rxjs@7.8.2) + semver: 7.8.5 serve-handler: 6.1.7 - shell-quote: 1.8.3 strip-json-comments: 5.0.3 + tinyglobby: 0.2.17 yocto-spinner: 1.1.0 - zod: 3.25.76 transitivePeerDependencies: + - '@hono/node-server' + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - rxjs - supports-color - typescript + - utf-8-validate + - zod material-icons@1.13.14: {} @@ -34975,6 +37407,31 @@ snapshots: merge2@1.4.1: {} + mermaid@11.17.2: + dependencies: + '@braintree/sanitize-url': 7.1.2 + '@iconify/utils': 3.1.7 + '@mermaid-js/parser': 1.2.1 + '@types/d3': 7.4.3 + '@upsetjs/venn.js': 2.0.0 + cytoscape: 3.34.3 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.3) + cytoscape-fcose: 2.2.0(cytoscape@3.34.3) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.14 + dayjs: 1.11.23 + dompurify: 3.4.1 + es-toolkit: 1.52.0 + fastdom: 1.0.12 + katex: 0.16.47 + khroma: 2.1.0 + marked: 16.4.2 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.3.0 + uuid: 13.0.0 + methods@1.1.2: {} metro-babel-transformer@0.83.5: @@ -35008,7 +37465,7 @@ snapshots: metro-cache: 0.83.5 metro-core: 0.83.5 metro-runtime: 0.83.5 - yaml: 2.8.3 + yaml: 2.9.1 transitivePeerDependencies: - bufferutil - supports-color @@ -35189,6 +37646,38 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + get-east-asian-width: 1.7.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly-util@2.1.1(micromark-util-types@2.0.2): + dependencies: + get-east-asian-width: 1.7.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 @@ -35571,14 +38060,14 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 - mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4): + mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4): dependencies: mobx: 6.15.0 react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + react-native: 0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) mobx-state-tree@7.0.2(mobx@6.15.0)(typescript@5.5.4): dependencies: @@ -35687,13 +38176,13 @@ snapshots: '@nestjs/common': 11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@supercharge/request-ip': 1.2.0 - nestjs-temporal-core@3.2.3(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2): + nestjs-temporal-core@3.2.3(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.21)(@temporalio/client@1.15.0)(@temporalio/common@1.15.0)(@temporalio/worker@1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1))(@temporalio/workflow@1.15.0)(reflect-metadata@0.2.2)(rxjs@7.8.2): dependencies: '@nestjs/common': 11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.21(@nestjs/common@11.1.21(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@11.1.21)(@nestjs/platform-express@11.1.21)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@temporalio/client': 1.15.0 '@temporalio/common': 1.15.0 - '@temporalio/worker': 1.15.0(@swc/helpers@0.5.13)(esbuild@0.27.7)(tslib@2.8.1) + '@temporalio/worker': 1.15.0(@swc/helpers@0.5.13)(esbuild@0.28.2)(tslib@2.8.1) '@temporalio/workflow': 1.15.0 ms: 2.1.3 reflect-metadata: 0.2.2 @@ -35701,13 +38190,13 @@ snapshots: netmask@2.0.2: {} - next-plausible@3.12.5(next@16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next-plausible@3.12.5(next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - next: 16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + next: 16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - next@16.3.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3): + next@16.3.1(@babel/core@8.0.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3): dependencies: '@next/env': 16.3.1 '@swc/helpers': 0.5.23 @@ -35716,7 +38205,7 @@ snapshots: postcss: 8.5.23 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react@19.2.4) + styled-jsx: 5.1.6(@babel/core@8.0.5)(babel-plugin-macros@3.1.0)(react@19.2.4) optionalDependencies: '@next/swc-darwin-arm64': 16.3.1 '@next/swc-darwin-x64': 16.3.1 @@ -35737,21 +38226,6 @@ snapshots: nexus-rpc@0.0.1: {} - nice-grpc-client-middleware-retry@3.1.13: - dependencies: - abort-controller-x: 0.4.3 - nice-grpc-common: 2.0.2 - - nice-grpc-common@2.0.2: - dependencies: - ts-error: 1.0.6 - - nice-grpc@2.1.14: - dependencies: - '@grpc/grpc-js': 1.14.3 - abort-controller-x: 0.4.3 - nice-grpc-common: 2.0.2 - no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -35759,7 +38233,7 @@ snapshots: node-abi@3.87.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 node-abort-controller@3.1.1: {} @@ -35793,7 +38267,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-forge@1.3.3: {} + node-forge@1.3.3: + optional: true node-gyp-build@4.8.4: {} @@ -35963,6 +38438,8 @@ snapshots: oblivious-set@1.4.0: {} + obug@2.2.1: {} + ofetch@1.5.1: dependencies: destr: 2.0.5 @@ -35991,31 +38468,19 @@ snapshots: dependencies: mimic-fn: 2.1.0 + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + open@7.4.2: dependencies: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.104.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): - dependencies: - '@types/node': 18.16.9 - '@types/node-fetch': 2.6.13 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - optionalDependencies: - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - zod: 3.25.76 - transitivePeerDependencies: - - encoding - - openai@5.23.2(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): - optionalDependencies: - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - zod: 3.25.76 - openai@6.27.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@3.25.76): optionalDependencies: ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -36026,8 +38491,14 @@ snapshots: ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) zod: 3.25.76 + openapi-fetch@0.17.0: + dependencies: + openapi-typescript-helpers: 0.1.0 + openapi-types@12.1.3: {} + openapi-typescript-helpers@0.1.0: {} + openapi3-ts@3.2.0: dependencies: yaml: 2.8.2 @@ -36197,6 +38668,8 @@ snapshots: package-json-from-dist@1.0.1: {} + package-manager-detector@1.8.0: {} + pako@0.2.9: {} param-case@3.0.4: @@ -36218,15 +38691,6 @@ snapshots: pbkdf2: 3.1.5 safe-buffer: 5.2.1 - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -36288,6 +38752,8 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 + path-data-parser@0.1.0: {} + path-exists@4.0.0: {} path-expression-matcher@1.6.2: {} @@ -36355,19 +38821,23 @@ snapshots: performance-now@2.1.0: {} - pg-cloudflare@1.3.0: + pg-cloudflare@1.4.0: optional: true pg-connection-string@2.12.0: {} + pg-connection-string@2.14.0: {} + pg-int8@1.0.1: {} - pg-pool@3.13.0(pg@8.20.0): + pg-pool@3.14.0(pg@8.23.0): dependencies: - pg: 8.20.0 + pg: 8.23.0 pg-protocol@1.13.0: {} + pg-protocol@1.16.0: {} + pg-types@2.2.0: dependencies: pg-int8: 1.0.1 @@ -36376,26 +38846,26 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.20.0: + pg@8.23.0: dependencies: - pg-connection-string: 2.12.0 - pg-pool: 3.13.0(pg@8.20.0) - pg-protocol: 1.13.0 + pg-connection-string: 2.14.0 + pg-pool: 3.14.0(pg@8.23.0) + pg-protocol: 1.16.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.3.0 + pg-cloudflare: 1.4.0 pgpass@1.0.5: dependencies: split2: 4.2.0 + phoenix@1.8.14: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.3: {} - picomatch@4.0.4: {} picomatch@4.0.5: {} @@ -36532,7 +39002,14 @@ snapshots: pngjs@5.0.0: {} - polotno@3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4): + points-on-curve@0.2.0: {} + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + + polotno@3.0.0-beta.25(@types/react@19.1.8)(@types/sortablejs@1.15.9)(konva@10.2.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4): dependencies: '@blueprintjs/core': 6.10.0(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@blueprintjs/icons': 6.8.0(@types/react@19.1.8)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -36543,7 +39020,7 @@ snapshots: mediabunny: 1.40.1 mensch: 0.3.4 mobx: 6.15.0 - mobx-react-lite: 4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + mobx-react-lite: 4.1.1(mobx@6.15.0)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) mobx-state-tree: 7.0.2(mobx@6.15.0)(typescript@5.5.4) nanoid: 3.3.11 quill: 2.0.3 @@ -36588,13 +39065,13 @@ snapshots: postcss: 8.5.26 ts-node: 10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4) - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.8.3): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.9.1): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 postcss: 8.5.26 - yaml: 2.8.3 + yaml: 2.9.1 postcss-nested@6.2.0(postcss@8.5.26): dependencies: @@ -36646,9 +39123,11 @@ snapshots: query-selector-shadow-dom: 1.0.1 web-vitals: 5.1.0 - posthog-node@5.17.2: + posthog-node@5.52.4(rxjs@7.8.2): dependencies: - '@posthog/core': 1.7.1 + '@posthog/core': 1.54.2 + optionalDependencies: + rxjs: 7.8.2 preact@10.28.4: {} @@ -36656,8 +39135,6 @@ snapshots: prettier@2.8.8: {} - prettier@3.8.1: {} - pretty-bytes@6.1.1: {} pretty-format@27.5.1: @@ -36686,8 +39163,6 @@ snapshots: transitivePeerDependencies: - supports-color - prismjs@1.27.0: {} - prismjs@1.30.0: {} probe-image-size@7.2.3: @@ -36738,10 +39213,6 @@ snapshots: property-expr@2.0.6: {} - property-information@5.6.0: - dependencies: - xtend: 4.0.2 - property-information@6.5.0: {} property-information@7.1.0: {} @@ -37035,13 +39506,6 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - react-colorful@5.6.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 @@ -37098,7 +39562,7 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-i18next@15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4): + react-i18next@15.7.4(i18next@25.8.14(typescript@5.5.4))(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.5.4): dependencies: '@babel/runtime': 7.28.6 html-parse-stringify: 3.0.1 @@ -37106,7 +39570,7 @@ snapshots: react: 19.2.4 optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + react-native: 0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) typescript: 5.5.4 react-is@16.13.1: {} @@ -37210,20 +39674,20 @@ snapshots: react-lifecycles-compat: 3.0.4 warning: 4.0.3 - react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10): + react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.84.1 - '@react-native/codegen': 0.84.1(@babel/core@7.29.0) + '@react-native/codegen': 0.84.1(@babel/core@8.0.5) '@react-native/community-cli-plugin': 0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@react-native/gradle-plugin': 0.84.1 '@react-native/js-polyfills': 0.84.1 '@react-native/normalize-colors': 0.84.1 - '@react-native/virtualized-lists': 0.84.1(@types/react@19.1.8)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + '@react-native/virtualized-lists': 0.84.1(@types/react@19.1.8)(react-native@0.84.1(@babel/core@8.0.5)(@types/react@19.1.8)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.29.0) + babel-jest: 29.7.0(@babel/core@8.0.5) babel-plugin-syntax-hermes-parser: 0.32.0 base64-js: 1.5.1 commander: 12.1.0 @@ -37334,7 +39798,7 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 - react-syntax-highlighter@15.6.6(react@19.2.4): + react-syntax-highlighter@16.1.1(react@19.2.4): dependencies: '@babel/runtime': 7.28.6 highlight.js: 10.7.3 @@ -37342,7 +39806,7 @@ snapshots: lowlight: 1.20.0 prismjs: 1.30.0 react: 19.2.4 - refractor: 3.6.0 + refractor: 5.0.0 react-tag-autocomplete@7.5.1(react@19.2.4): dependencies: @@ -37422,6 +39886,10 @@ snapshots: dependencies: readable-stream: 4.7.0 + readdir-glob@3.0.0: + dependencies: + minimatch: 10.2.4 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -37466,12 +39934,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - refractor@3.6.0: - dependencies: - hastscript: 6.0.0 - parse-entities: 2.0.0 - prismjs: 1.27.0 - refractor@4.9.0: dependencies: '@types/hast': 2.3.10 @@ -37494,6 +39956,16 @@ snapshots: regenerator-runtime@0.13.11: {} + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -37512,15 +39984,6 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 - registry-auth-token@3.3.2: - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - - registry-url@3.1.0: - dependencies: - rc: 1.2.8 - regjsgen@0.8.0: {} regjsparser@0.13.0: @@ -37541,12 +40004,26 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.1.0 + rehype-harden@1.1.8: + dependencies: + unist-util-visit: 5.1.0 + rehype-ignore@2.0.3: dependencies: hast-util-select: 6.0.4 unified: 11.0.5 unist-util-visit: 5.1.0 + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.8 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.35 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -37583,6 +40060,11 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.1.0 + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + rehype-slug@6.0.0: dependencies: '@types/hast': 3.0.4 @@ -37604,6 +40086,26 @@ snapshots: rehype-stringify: 10.0.1 unified: 11.0.5 + remark-cjk-friendly-gfm-strikethrough@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly-gfm-strikethrough: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + + remark-cjk-friendly@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 @@ -37666,6 +40168,10 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + remend@1.0.1: {} + + remend@1.3.1: {} + remove-markdown@0.5.5: {} request-promise-core@1.1.3(request@2.88.2): @@ -37787,6 +40293,8 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 + robust-predicates@3.0.3: {} + rolldown@1.2.4: dependencies: '@oxc-project/types': 0.144.0 @@ -37807,13 +40315,13 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.4 '@rolldown/binding-win32-x64-msvc': 1.2.4 - rollup-plugin-esbuild@6.2.1(esbuild@0.27.7)(rollup@4.59.0): + rollup-plugin-esbuild@6.2.1(esbuild@0.28.2)(rollup@4.63.3): dependencies: debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 - esbuild: 0.27.7 + esbuild: 0.28.2 get-tsconfig: 4.13.6 - rollup: 4.59.0 + rollup: 4.63.3 unplugin-utils: 0.2.5 transitivePeerDependencies: - supports-color @@ -37853,8 +40361,47 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 + rollup@4.63.3: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.3 + '@rollup/rollup-android-arm64': 4.63.3 + '@rollup/rollup-darwin-arm64': 4.63.3 + '@rollup/rollup-darwin-x64': 4.63.3 + '@rollup/rollup-freebsd-arm64': 4.63.3 + '@rollup/rollup-freebsd-x64': 4.63.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.3 + '@rollup/rollup-linux-arm-musleabihf': 4.63.3 + '@rollup/rollup-linux-arm64-gnu': 4.63.3 + '@rollup/rollup-linux-arm64-musl': 4.63.3 + '@rollup/rollup-linux-loong64-gnu': 4.63.3 + '@rollup/rollup-linux-loong64-musl': 4.63.3 + '@rollup/rollup-linux-ppc64-gnu': 4.63.3 + '@rollup/rollup-linux-ppc64-musl': 4.63.3 + '@rollup/rollup-linux-riscv64-gnu': 4.63.3 + '@rollup/rollup-linux-riscv64-musl': 4.63.3 + '@rollup/rollup-linux-s390x-gnu': 4.63.3 + '@rollup/rollup-linux-x64-gnu': 4.63.3 + '@rollup/rollup-linux-x64-musl': 4.63.3 + '@rollup/rollup-openbsd-x64': 4.63.3 + '@rollup/rollup-openharmony-arm64': 4.63.3 + '@rollup/rollup-win32-arm64-msvc': 4.63.3 + '@rollup/rollup-win32-ia32-msvc': 4.63.3 + '@rollup/rollup-win32-x64-gnu': 4.63.3 + '@rollup/rollup-win32-x64-msvc': 4.63.3 + fsevents: 2.3.3 + rope-sequence@1.3.4: {} + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + router@2.2.0: dependencies: debug: 4.4.3(supports-color@5.5.0) @@ -37895,6 +40442,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rw@1.3.3: {} + rxjs@6.6.7: dependencies: tslib: 1.14.1 @@ -38002,7 +40551,7 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 semver@6.3.1: {} @@ -38082,22 +40631,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve@14.2.6: - dependencies: - '@zeit/schemas': 2.36.0 - ajv: 8.18.0 - arg: 5.0.2 - boxen: 7.0.0 - chalk: 5.0.1 - chalk-template: 0.4.0 - clipboardy: 3.0.0 - compression: 1.8.1 - is-port-reachable: 4.0.0 - serve-handler: 6.1.7 - update-check: 1.5.4 - transitivePeerDependencies: - - supports-color - server-only@0.0.1: {} set-blocking@2.0.0: {} @@ -38213,6 +40746,17 @@ snapshots: shell-quote@1.8.3: {} + shiki@3.23.0: + dependencies: + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -38267,8 +40811,6 @@ snapshots: dependencies: semver: 7.7.4 - simple-wcswidth@1.1.2: {} - sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.29 @@ -38292,7 +40834,7 @@ snapshots: direction: 1.0.4 is-hotkey: 0.1.8 is-plain-object: 5.0.0 - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) scroll-into-view-if-needed: 2.2.31 @@ -38365,11 +40907,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + source-map-loader@4.0.2(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) source-map-support@0.5.13: dependencies: @@ -38389,8 +40931,6 @@ snapshots: source-map@0.7.6: {} - space-separated-tokens@1.1.5: {} - space-separated-tokens@2.0.2: {} split-on-first@1.1.0: {} @@ -38463,10 +41003,53 @@ snapshots: stream-shift@1.0.3: {} + streamdown@1.6.11(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4): + dependencies: + clsx: 2.1.1 + hast: 1.0.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + katex: 0.16.35 + lucide-react: 0.542.0(react@19.2.4) + marked: 16.4.2 + mermaid: 11.17.2 + react: 19.2.4 + rehype-harden: 1.1.8 + rehype-katex: 7.0.1 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + remark-cjk-friendly: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-cjk-friendly-gfm-strikethrough: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remend: 1.0.1 + shiki: 3.23.0 + tailwind-merge: 3.7.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + transitivePeerDependencies: + - '@types/mdast' + - micromark + - micromark-util-types + - supports-color + streamsearch@1.1.0: {} + streamx@2.28.1: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + strict-uri-encode@2.0.0: {} + strictdom@1.0.1: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -38567,8 +41150,6 @@ snapshots: strip-final-newline@4.0.0: {} - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} strip-json-comments@5.0.3: {} @@ -38621,12 +41202,12 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react@19.2.4): + styled-jsx@5.1.6(@babel/core@8.0.5)(babel-plugin-macros@3.1.0)(react@19.2.4): dependencies: client-only: 0.0.1 react: 19.2.4 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 8.0.5 babel-plugin-macros: 3.1.0 stylis-plugin-rtl@2.1.1(stylis@4.3.6): @@ -38691,11 +41272,11 @@ snapshots: dependencies: '@scarf/scarf': 1.4.0 - swc-loader@0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + swc-loader@0.2.7(@swc/core@1.5.7(@swc/helpers@0.5.13))(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.13) '@swc/counter': 0.1.3 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) sweetalert2@11.4.8: {} @@ -38713,6 +41294,8 @@ snapshots: tailwind-merge@1.14.0: {} + tailwind-merge@3.7.0: {} + tailwind-scrollbar@3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4))): dependencies: tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)) @@ -38750,6 +41333,17 @@ snapshots: tapable@2.3.0: {} + tar-stream@3.2.1: + dependencies: + b4a: 1.9.0 + bare-fs: 4.8.1 + fast-fifo: 1.3.2 + streamx: 2.28.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -38759,27 +41353,34 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - terser-webpack-plugin@5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + teex@1.0.1: + dependencies: + streamx: 2.28.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + terser-webpack-plugin@5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.0 - webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.13) - esbuild: 0.27.7 + esbuild: 0.28.2 - terser-webpack-plugin@5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)): + terser-webpack-plugin@5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.0 - webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7) + webpack: 5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2) optionalDependencies: '@swc/core': 1.5.7(@swc/helpers@0.5.13) - esbuild: 0.27.7 + esbuild: 0.28.2 terser@5.46.0: dependencies: @@ -38794,6 +41395,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.5 + text-decoder@1.2.7: + dependencies: + b4a: 1.9.0 + transitivePeerDependencies: + - react-native-b4a + text-encoding-utf-8@1.0.2: {} text-table@0.2.0: {} @@ -38844,15 +41451,17 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.3.1: {} + tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinypool@1.1.1: {} @@ -38988,7 +41597,7 @@ snapshots: dependencies: typescript: 5.5.4 - ts-error@1.0.6: {} + ts-dedent@2.3.0: {} ts-essentials@10.1.1(typescript@5.5.4): optionalDependencies: @@ -39004,7 +41613,7 @@ snapshots: dependencies: tslib: 2.8.1 - ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(esbuild@0.27.7)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4): + ts-jest@29.4.6(@babel/core@8.0.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@8.0.5))(esbuild@0.28.2)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.16.9)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4)))(typescript@5.5.4): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -39018,11 +41627,11 @@ snapshots: typescript: 5.5.4 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.29.0 + '@babel/core': 8.0.5 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.29.0) - esbuild: 0.27.7 + babel-jest: 29.7.0(@babel/core@8.0.5) + esbuild: 0.28.2 jest-util: 29.7.0 ts-node@10.9.2(@swc/core@1.5.7(@swc/helpers@0.5.13))(@types/node@18.16.9)(typescript@5.5.4): @@ -39075,7 +41684,9 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.8.3): + tsscmp@1.0.6: {} + + tsup@8.5.1(@swc/core@1.5.7(@swc/helpers@0.5.13))(jiti@2.6.1)(postcss@8.5.26)(typescript@5.5.4)(yaml@2.9.1): dependencies: bundle-require: 5.1.0(esbuild@0.27.3) cac: 6.7.14 @@ -39086,7 +41697,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.8.3) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.26)(yaml@2.9.1) resolve-from: 5.0.0 rollup: 4.59.0 source-map: 0.7.6 @@ -39128,6 +41739,8 @@ snapshots: proper-lockfile: 4.1.2 url-parse: 1.5.10 + tw-animate-css@1.4.0: {} + tweetnacl@0.14.5: {} tweetnacl@1.0.3: {} @@ -39167,7 +41780,7 @@ snapshots: graphql: 16.13.1 graphql-query-complexity: 0.12.0(graphql@16.13.1) graphql-scalars: 1.25.0(graphql@16.13.1) - semver: 7.7.4 + semver: 7.8.5 tslib: 2.8.1 optionalDependencies: class-validator: 0.14.4 @@ -39229,7 +41842,7 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-paths@1.5.1(typescript@5.5.4): + typescript-paths@1.5.2(typescript@5.5.4): dependencies: typescript: 5.5.4 @@ -39273,6 +41886,12 @@ snapshots: undici-types@6.21.0: {} + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@6.28.1: {} + undici@7.25.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -39334,6 +41953,11 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-generated@2.0.1: {} unist-util-is@5.2.1: @@ -39404,7 +42028,7 @@ snapshots: unplugin-utils@0.2.5: dependencies: pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 unrs-resolver@1.11.1: dependencies: @@ -39453,11 +42077,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-check@1.5.4: - dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 - upper-case-first@2.0.2: dependencies: tslib: 2.8.1 @@ -39533,6 +42152,10 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + use-stick-to-bottom@1.1.6(react@19.2.4): + dependencies: + react: 19.2.4 + use-sync-external-store@1.2.0(react@19.2.4): dependencies: react: 19.2.4 @@ -39607,6 +42230,8 @@ snapshots: vary@1.1.2: {} + verkit@0.3.2: {} + verror@1.10.0: dependencies: assert-plus: 1.0.0 @@ -39691,13 +42316,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vite-node@3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - '@types/node' - jiti @@ -39712,22 +42337,22 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)): + vite-tsconfig-paths@5.1.4(typescript@5.5.4)(vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)): dependencies: debug: 4.4.3(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.5.4) optionalDependencies: - vite: 8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) transitivePeerDependencies: - supports-color - typescript - vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.26 rollup: 4.59.0 tinyglobby: 0.2.15 @@ -39738,9 +42363,9 @@ snapshots: lightningcss: 1.33.0 sass: 1.97.3 terser: 5.46.0 - yaml: 2.8.3 + yaml: 2.9.1 - vite@8.2.1(@types/node@18.16.9)(esbuild@0.27.7)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vite@8.2.1(@types/node@18.16.9)(esbuild@0.28.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -39749,17 +42374,17 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 18.16.9 - esbuild: 0.27.7 + esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.97.3 terser: 5.46.0 - yaml: 2.8.3 + yaml: 2.9.1 - vitest@3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3): + vitest@3.1.4(@types/debug@4.1.12)(@types/node@18.16.9)(@vitest/ui@1.6.0)(happy-dom@15.11.7)(jiti@2.6.1)(jsdom@22.1.0(bufferutil@4.1.0)(canvas@2.11.2)(utf-8-validate@5.0.10))(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1): dependencies: '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3)) + '@vitest/mocker': 3.1.4(vite@6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.1.4 '@vitest/snapshot': 3.1.4 @@ -39776,8 +42401,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) - vite-node: 3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.3) + vite: 6.4.1(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) + vite-node: 3.1.4(@types/node@18.16.9)(jiti@2.6.1)(lightningcss@1.33.0)(sass@1.97.3)(terser@5.46.0)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -39830,20 +42455,6 @@ snapshots: dependencies: defaults: 1.0.4 - weaviate-client@3.12.0: - dependencies: - '@datastructures-js/deque': 1.0.8 - abort-controller-x: 0.5.0 - graphql: 16.13.1 - graphql-request: 6.1.0(graphql@16.13.1) - long: 5.3.2 - nice-grpc: 2.1.14 - nice-grpc-client-middleware-retry: 3.1.13 - nice-grpc-common: 2.0.2 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} @@ -39864,7 +42475,7 @@ snapshots: webpack-sources@3.3.4: {} - webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7): + webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -39888,7 +42499,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + terser-webpack-plugin: 5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)(webpack@5.105.4(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -39896,7 +42507,7 @@ snapshots: - esbuild - uglify-js - webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7): + webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -39920,7 +42531,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.27.7)) + terser-webpack-plugin: 5.3.17(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)(webpack@5.106.0(@swc/core@1.5.7(@swc/helpers@0.5.13))(esbuild@0.28.2)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: @@ -40034,10 +42645,6 @@ snapshots: dependencies: string-width: 4.2.3 - widest-line@4.0.1: - dependencies: - string-width: 5.1.2 - wildcard@1.1.2: {} win-guid@0.2.1: {} @@ -40098,6 +42705,11 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 6.0.6 + ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + xml-name-validator@4.0.0: {} xml-name-validator@5.0.0: {} @@ -40141,6 +42753,8 @@ snapshots: yaml@2.8.3: {} + yaml@2.9.1: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -40191,18 +42805,28 @@ snapshots: toposort: 2.0.2 type-fest: 2.19.0 + zip-stream@7.0.5: + dependencies: + compress-commons: 7.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + zod-from-json-schema@0.0.5: dependencies: zod: 3.25.76 zod-from-json-schema@0.5.2: dependencies: - zod: 4.3.6 + zod: 4.6.5 zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-validation-error@4.0.2(zod@3.25.76): dependencies: zod: 3.25.76 @@ -40213,6 +42837,8 @@ snapshots: zod@4.3.6: {} + zod@4.6.5: {} + zustand@5.0.11(@types/react@19.1.8)(immer@9.0.21)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): optionalDependencies: '@types/react': 19.1.8 From b267fbeb8efb861470bfbfb263863f19b65fb156 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 16:10:07 +0700 Subject: [PATCH 43/61] feat(frontend): hide the Chatbase widget while the creation modal is open Co-Authored-By: Claude Fable 5.1 --- apps/frontend/src/app/global.scss | 6 ++++++ apps/frontend/src/components/new-launch/add.edit.modal.tsx | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/apps/frontend/src/app/global.scss b/apps/frontend/src/app/global.scss index 1b7000c5a7..a900a44d4f 100644 --- a/apps/frontend/src/app/global.scss +++ b/apps/frontend/src/app/global.scss @@ -524,6 +524,12 @@ div div .set-font-family { display: none !important; } +.hideChatbase #chatbase-bubble-button, +.hideChatbase #chatbase-bubble-window, +.hideChatbase #chatbase-message-bubbles { + display: none !important; +} + html[dir='rtl'] .rbox { direction: rtl !important; } diff --git a/apps/frontend/src/components/new-launch/add.edit.modal.tsx b/apps/frontend/src/components/new-launch/add.edit.modal.tsx index a974e4bf5a..7de3d565d9 100644 --- a/apps/frontend/src/components/new-launch/add.edit.modal.tsx +++ b/apps/frontend/src/components/new-launch/add.edit.modal.tsx @@ -52,6 +52,13 @@ export const AddEditModal: FC = (props) => { setIsCreateSet(!!props.addEditSets); }, []); + useEffect(() => { + document.querySelector('body')?.classList.add('hideChatbase'); + return () => { + document.querySelector('body')?.classList.remove('hideChatbase'); + }; + }, []); + if (!integrations.length) { return null; } From facc77d8a1cf9474e6890754de3e6f5cb2488856 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Wed, 16 Sep 2026 23:21:03 +0200 Subject: [PATCH 44/61] feat: x-postiz-org override and support debug endpoints on the public API --- apps/backend/src/main.ts | 1 + .../v1/public.integrations.controller.ts | 44 +++++++++- .../services/auth/public.auth.middleware.ts | 62 +++++++++---- .../admin-stats/admin-stats.repository.ts | 87 +++++++++++++++++++ .../prisma/admin-stats/admin-stats.service.ts | 5 ++ .../integrations/integration.repository.ts | 85 ++++++++++++++++++ .../integrations/integration.service.ts | 4 + .../database/prisma/posts/posts.repository.ts | 53 +++++++++++ .../database/prisma/posts/posts.service.ts | 4 + .../dtos/analytics/get.org.activity.dto.ts | 11 +++ 10 files changed, 338 insertions(+), 18 deletions(-) create mode 100644 libraries/nestjs-libraries/src/dtos/analytics/get.org.activity.dto.ts diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index 703a064243..31228ab820 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -31,6 +31,7 @@ async function start() { 'auth', 'showorg', 'impersonate', + 'x-postiz-org', 'x-copilotkit-runtime-client-gql-version', ], exposedHeaders: [ diff --git a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts index 8d1e0aa954..c6617354b1 100644 --- a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts +++ b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts @@ -47,6 +47,9 @@ import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/us import { SuperAdminGuard } from '@gitroom/backend/services/auth/super.admin.guard'; import { timer } from '@gitroom/helpers/utils/timer'; import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; +import { AdminStatsService } from '@gitroom/nestjs-libraries/database/prisma/admin-stats/admin-stats.service'; +import { GetOrgActivityDto } from '@gitroom/nestjs-libraries/dtos/analytics/get.org.activity.dto'; +import dayjs from 'dayjs'; @ApiTags('Public API') @Controller('/public/v1') @@ -58,7 +61,8 @@ export class PublicIntegrationsController { private _notificationService: NotificationService, private _integrationManager: IntegrationManager, private _refreshIntegrationService: RefreshIntegrationService, - private _usersService: UsersService + private _usersService: UsersService, + private _adminStatsService: AdminStatsService ) {} @Post('/upload') @@ -317,6 +321,44 @@ export class PublicIntegrationsController { return this._usersService.getImpersonateUser(name); } + @Get('/debug/posts/:id') + async getPostTimeline( + @GetOrgFromRequest() org: Organization, + @Param('id') id: string + ) { + Sentry.metrics.count('public_api-request', 1); + const timeline = await this._postsService.getPostTimeline(id, org.id); + + if (!timeline) { + throw new HttpException({ msg: 'Post not found' }, 404); + } + + return timeline; + } + + @Get('/debug/channels') + async getChannelHealth(@GetOrgFromRequest() org: Organization) { + Sentry.metrics.count('public_api-request', 1); + return this._integrationService.getChannelHealth(org.id); + } + + @Get('/debug/activity') + async getOrgActivity( + @GetOrgFromRequest() org: Organization, + @Query() query: GetOrgActivityDto + ) { + Sentry.metrics.count('public_api-request', 1); + + const from = query.from ? dayjs(query.from) : dayjs().subtract(30, 'day'); + const to = query.to ? dayjs(query.to) : dayjs(); + + return this._adminStatsService.getOrgActivity({ + organizationId: org.id, + from: from.startOf('day').toDate(), + to: to.endOf('day').toDate(), + }); + } + @Get('/notifications') async getNotifications( @GetOrgFromRequest() org: Organization, diff --git a/apps/backend/src/services/auth/public.auth.middleware.ts b/apps/backend/src/services/auth/public.auth.middleware.ts index 36353de88a..4436a80df2 100644 --- a/apps/backend/src/services/auth/public.auth.middleware.ts +++ b/apps/backend/src/services/auth/public.auth.middleware.ts @@ -1,5 +1,6 @@ -import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; +import { HttpStatus, Injectable, Logger, NestMiddleware } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; +import { Organization } from '@prisma/client'; import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service'; import { HttpForbiddenException } from '@gitroom/nestjs-libraries/services/exception.filter'; @@ -7,10 +8,18 @@ import { setSentryUserContext } from '@gitroom/nestjs-libraries/sentry/initializ @Injectable() export class PublicAuthMiddleware implements NestMiddleware { + private readonly _logger = new Logger(PublicAuthMiddleware.name); + constructor( private _organizationService: OrganizationService, private _oauthService: OAuthService ) {} + + private setOrg(req: Request, org: Organization) { + // @ts-ignore + req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] }; + } + async use(req: Request, res: Response, next: NextFunction) { const auth = (req.headers.authorization || req.headers.Authorization) as string; @@ -19,6 +28,8 @@ export class PublicAuthMiddleware implements NestMiddleware { return; } try { + let org: Organization & { subscription?: unknown }; + if (auth.startsWith('pos_')) { const authorization = await this._oauthService.getOrgByOAuthToken(auth); if (!authorization) { @@ -28,34 +39,51 @@ export class PublicAuthMiddleware implements NestMiddleware { return; } - const org = authorization.organization; - if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) { - res - .status(HttpStatus.UNAUTHORIZED) - .json({ msg: 'No subscription found' }); - return; - } - - // @ts-ignore - req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] }; + org = authorization.organization; } else { - const org = await this._organizationService.getOrgByApiKey(auth); + org = await this._organizationService.getOrgByApiKey(auth); if (!org) { res .status(HttpStatus.UNAUTHORIZED) .json({ msg: 'Invalid API key' }); return; } + } - if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) { + if (!!process.env.STRIPE_SECRET_KEY && !org.subscription) { + res + .status(HttpStatus.UNAUTHORIZED) + .json({ msg: 'No subscription found' }); + return; + } + + this.setOrg(req, org); + + const overrideOrgId = (req.headers['x-postiz-org'] as string)?.trim(); + + if (overrideOrgId) { + if (!(await this._organizationService.hasSuperAdminUser(org.id))) { + res.status(HttpStatus.FORBIDDEN).json({ msg: 'Unauthorized' }); + return; + } + + const overrideOrg = + await this._organizationService.getOrgByIdWithSubscription( + overrideOrgId + ); + + if (!overrideOrg || overrideOrg.deletedAt) { res - .status(HttpStatus.UNAUTHORIZED) - .json({ msg: 'No subscription found' }); + .status(HttpStatus.NOT_FOUND) + .json({ msg: 'Organization not found' }); return; } - // @ts-ignore - req.org = { ...org, users: [{ users: { role: 'SUPERADMIN' } }] }; + this.setOrg(req, overrideOrg); + + this._logger.log( + `Organization override performed by organization ${org.id}: acting as ${overrideOrg.id} on ${req.method} ${req.path}` + ); } } catch (err) { throw new HttpForbiddenException(); diff --git a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts index 160825a525..4ef2331afc 100644 --- a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts @@ -6,6 +6,13 @@ export interface StatsParams { from: Date; to: Date; unknownOnly?: boolean; + organizationId?: string; +} + +export interface OrgActivityParams { + from: Date; + to: Date; + organizationId: string; } // Unknown errors are stored as the serialized error payload, e.g. @@ -17,6 +24,23 @@ interface PerSocial { count: number; } +interface PerState { + state: string; + count: number; +} + +export interface OrgActivityResponse { + from: string; + to: string; + organizationId: string; + errors: { total: number; perSocial: PerSocial[] }; + posts: { total: number; perSocial: PerSocial[] }; + connected: { total: number; perSocial: PerSocial[] }; + postsByState: PerState[]; + firstActivityAt: string | null; + lastActivityAt: string | null; +} + export interface StatsResponse { from: string; to: string; @@ -47,6 +71,9 @@ export class AdminStatsRepository { ...(params.unknownOnly ? { message: { contains: UNKNOWN_ERROR_TOKEN } } : {}), + ...(params.organizationId + ? { organizationId: params.organizationId } + : {}), }; const [total, grouped] = await Promise.all([ @@ -77,6 +104,9 @@ export class AdminStatsRepository { parentPostId: null, deletedAt: null, publishDate: { gte: params.from, lte: params.to }, + ...(params.organizationId + ? { organizationId: params.organizationId } + : {}), }; const [total, grouped] = await Promise.all([ @@ -254,6 +284,9 @@ export class AdminStatsRepository { const where: Prisma.IntegrationWhereInput = { deletedAt: null, createdAt: { gte: params.from, lte: params.to }, + ...(params.organizationId + ? { organizationId: params.organizationId } + : {}), }; const [total, grouped] = await Promise.all([ @@ -276,6 +309,60 @@ export class AdminStatsRepository { }; } + private async postStateStats(params: OrgActivityParams) { + const grouped = await this._post.model.post.groupBy({ + by: ['state'], + where: { + organizationId: params.organizationId, + parentPostId: null, + deletedAt: null, + publishDate: { gte: params.from, lte: params.to }, + }, + _count: { _all: true }, + }); + + return grouped + .map((g) => ({ state: g.state as string, count: g._count._all })) + .sort((a, b) => b.count - a.count || a.state.localeCompare(b.state)); + } + + private async activityRange(organizationId: string) { + const { _min, _max } = await this._post.model.post.aggregate({ + where: { organizationId, state: 'PUBLISHED', deletedAt: null }, + _min: { publishDate: true }, + _max: { publishDate: true }, + }); + + return { + firstActivityAt: _min.publishDate?.toISOString() || null, + lastActivityAt: _max.publishDate?.toISOString() || null, + }; + } + + async getOrgActivity( + params: OrgActivityParams + ): Promise { + const [errors, posts, connected, postsByState, activity] = + await Promise.all([ + this.errorStats(params), + this.postStats(params), + this.connectedStats(params), + this.postStateStats(params), + this.activityRange(params.organizationId), + ]); + + return { + from: params.from.toISOString(), + to: params.to.toISOString(), + organizationId: params.organizationId, + errors, + posts, + connected, + postsByState, + ...activity, + }; + } + async getStats(params: StatsParams): Promise { const [errors, posts, accounts, connected, activeOrgsBySource] = await Promise.all([ diff --git a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts index e1af176bb6..62c024c3a5 100644 --- a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { AdminStatsRepository, + OrgActivityParams, StatsParams, } from '@gitroom/nestjs-libraries/database/prisma/admin-stats/admin-stats.repository'; @@ -11,4 +12,8 @@ export class AdminStatsService { getStats(params: StatsParams) { return this._adminStatsRepository.getStats(params); } + + getOrgActivity(params: OrgActivityParams) { + return this._adminStatsRepository.getOrgActivity(params); + } } diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts index aa241ff24c..7dd598008d 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts @@ -560,6 +560,91 @@ export class IntegrationRepository { }); } + async getChannelHealth(org: string) { + const [integrations, lastPublished, lastErrored] = await Promise.all([ + this._integration.model.integration.findMany({ + where: { + organizationId: org, + }, + orderBy: { + createdAt: 'asc', + }, + select: { + id: true, + internalId: true, + name: true, + providerIdentifier: true, + type: true, + disabled: true, + refreshNeeded: true, + inBetweenSteps: true, + tokenExpiration: true, + deletedAt: true, + createdAt: true, + updatedAt: true, + customer: { + select: { + id: true, + name: true, + }, + }, + }, + }), + this._posts.model.post.findMany({ + where: { + organizationId: org, + state: 'PUBLISHED', + deletedAt: null, + }, + orderBy: [{ integrationId: 'asc' }, { publishDate: 'desc' }], + distinct: ['integrationId'], + select: { + id: true, + integrationId: true, + publishDate: true, + releaseURL: true, + }, + }), + this._posts.model.post.findMany({ + where: { + organizationId: org, + state: 'ERROR', + deletedAt: null, + }, + orderBy: [{ integrationId: 'asc' }, { updatedAt: 'desc' }], + distinct: ['integrationId'], + select: { + id: true, + integrationId: true, + updatedAt: true, + error: true, + }, + }), + ]); + + const publishedByIntegration = new Map( + lastPublished.map((post) => [post.integrationId, post]) + ); + const erroredByIntegration = new Map( + lastErrored.map((post) => [post.integrationId, post]) + ); + + return integrations.map((integration) => { + const published = publishedByIntegration.get(integration.id); + const errored = erroredByIntegration.get(integration.id); + + return { + ...integration, + lastPublishedAt: published?.publishDate || null, + lastPublishedPostId: published?.id || null, + lastPublishedUrl: published?.releaseURL || null, + lastErrorAt: errored?.updatedAt || null, + lastErrorPostId: errored?.id || null, + lastError: errored?.error || null, + }; + }); + } + async disableChannel(org: string, id: string) { await this._integration.model.integration.update({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts index 884ce9578e..a0f4fe7a4e 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts @@ -154,6 +154,10 @@ export class IntegrationService { return this._integrationRepository.getIntegrationsList(org); } + getChannelHealth(org: string) { + return this._integrationRepository.getChannelHealth(org); + } + getIntegrationForOrder(id: string, order: string, user: string, org: string) { return this._integrationRepository.getIntegrationForOrder( id, diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts index 5741b6a966..1aa9e1538f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -734,6 +734,59 @@ export class PostsRepository { }); } + private get postTimelineSelect() { + return { + id: true, + state: true, + publishDate: true, + createdAt: true, + updatedAt: true, + deletedAt: true, + releaseId: true, + releaseURL: true, + error: true, + creationMethod: true, + group: true, + parentPostId: true, + } as const; + } + + getPostTimeline(id: string, org: string) { + return this._post.model.post.findFirst({ + where: { + id, + organizationId: org, + }, + select: { + ...this.postTimelineSelect, + integration: { + select: { + id: true, + name: true, + providerIdentifier: true, + disabled: true, + refreshNeeded: true, + deletedAt: true, + }, + }, + childrenPost: { + select: this.postTimelineSelect, + orderBy: { publishDate: 'asc' as const }, + }, + errors: { + select: { + id: true, + platform: true, + message: true, + body: true, + createdAt: true, + }, + orderBy: { createdAt: 'desc' as const }, + }, + }, + }); + } + findAllExistingCategories() { return this._popularPosts.model.popularPosts.findMany({ select: { diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 3467dc9811..5d5508bc6b 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -146,6 +146,10 @@ export class PostsService { return this._postRepository.getPostById(postId, orgId); } + async getPostTimeline(postId: string, orgId: string) { + return this._postRepository.getPostTimeline(postId, orgId); + } + async updateReleaseId(orgId: string, postId: string, releaseId: string) { return this._postRepository.updateReleaseId(postId, orgId, releaseId); } diff --git a/libraries/nestjs-libraries/src/dtos/analytics/get.org.activity.dto.ts b/libraries/nestjs-libraries/src/dtos/analytics/get.org.activity.dto.ts new file mode 100644 index 0000000000..6311b1d925 --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/analytics/get.org.activity.dto.ts @@ -0,0 +1,11 @@ +import { IsDateString, IsOptional } from 'class-validator'; + +export class GetOrgActivityDto { + @IsOptional() + @IsDateString() + from?: string; + + @IsOptional() + @IsDateString() + to?: string; +} From 671b8eae0b34b5632123a743689f1429bf28bf8e Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Thu, 17 Sep 2026 08:17:22 +0200 Subject: [PATCH 45/61] fix: report current channel counts alongside channels connected in range --- .../admin-stats/admin-stats.repository.ts | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts index 4ef2331afc..cd15449512 100644 --- a/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/admin-stats/admin-stats.repository.ts @@ -35,7 +35,8 @@ export interface OrgActivityResponse { organizationId: string; errors: { total: number; perSocial: PerSocial[] }; posts: { total: number; perSocial: PerSocial[] }; - connected: { total: number; perSocial: PerSocial[] }; + connectedInRange: { total: number; perSocial: PerSocial[] }; + channels: { total: number; perSocial: PerSocial[] }; postsByState: PerState[]; firstActivityAt: string | null; lastActivityAt: string | null; @@ -326,6 +327,32 @@ export class AdminStatsRepository { .sort((a, b) => b.count - a.count || a.state.localeCompare(b.state)); } + private async currentChannelStats(organizationId: string) { + const where: Prisma.IntegrationWhereInput = { + organizationId, + deletedAt: null, + }; + + const [total, grouped] = await Promise.all([ + this._integration.model.integration.count({ where }), + this._integration.model.integration.groupBy({ + by: ['providerIdentifier'], + where, + _count: { _all: true }, + }), + ]); + + return { + total, + perSocial: sortDesc( + grouped.map((g) => ({ + provider: g.providerIdentifier, + count: g._count._all, + })) + ), + }; + } + private async activityRange(organizationId: string) { const { _min, _max } = await this._post.model.post.aggregate({ where: { organizationId, state: 'PUBLISHED', deletedAt: null }, @@ -342,11 +369,12 @@ export class AdminStatsRepository { async getOrgActivity( params: OrgActivityParams ): Promise { - const [errors, posts, connected, postsByState, activity] = + const [errors, posts, connectedInRange, channels, postsByState, activity] = await Promise.all([ this.errorStats(params), this.postStats(params), this.connectedStats(params), + this.currentChannelStats(params.organizationId), this.postStateStats(params), this.activityRange(params.organizationId), ]); @@ -357,7 +385,8 @@ export class AdminStatsRepository { organizationId: params.organizationId, errors, posts, - connected, + connectedInRange, + channels, postsByState, ...activity, }; From b4da5597504a49231770233daf504aa9413da421 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Thu, 17 Sep 2026 09:41:11 +0200 Subject: [PATCH 46/61] fix: exclude oauth apps from superadmin surfaces and bound the channel health query --- .../services/auth/public.auth.middleware.ts | 11 ++- .../src/services/auth/super.admin.guard.ts | 4 +- .../integrations/integration.repository.ts | 87 ++++++++++++++----- 3 files changed, 78 insertions(+), 24 deletions(-) diff --git a/apps/backend/src/services/auth/public.auth.middleware.ts b/apps/backend/src/services/auth/public.auth.middleware.ts index 4436a80df2..6c0b44301e 100644 --- a/apps/backend/src/services/auth/public.auth.middleware.ts +++ b/apps/backend/src/services/auth/public.auth.middleware.ts @@ -29,8 +29,12 @@ export class PublicAuthMiddleware implements NestMiddleware { } try { let org: Organization & { subscription?: unknown }; + const isOAuthApp = auth.startsWith('pos_'); - if (auth.startsWith('pos_')) { + // @ts-ignore + req.isOAuthApp = isOAuthApp; + + if (isOAuthApp) { const authorization = await this._oauthService.getOrgByOAuthToken(auth); if (!authorization) { res @@ -62,7 +66,10 @@ export class PublicAuthMiddleware implements NestMiddleware { const overrideOrgId = (req.headers['x-postiz-org'] as string)?.trim(); if (overrideOrgId) { - if (!(await this._organizationService.hasSuperAdminUser(org.id))) { + if ( + isOAuthApp || + !(await this._organizationService.hasSuperAdminUser(org.id)) + ) { res.status(HttpStatus.FORBIDDEN).json({ msg: 'Unauthorized' }); return; } diff --git a/apps/backend/src/services/auth/super.admin.guard.ts b/apps/backend/src/services/auth/super.admin.guard.ts index 323d661e47..fb2a46409d 100644 --- a/apps/backend/src/services/auth/super.admin.guard.ts +++ b/apps/backend/src/services/auth/super.admin.guard.ts @@ -16,10 +16,12 @@ export class SuperAdminGuard implements CanActivate { const request: Request = context.switchToHttp().getRequest(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - const { org }: { org: Organization } = request; + const { org, isOAuthApp }: { org: Organization; isOAuthApp?: boolean } = + request; if ( !org || + isOAuthApp || !(await this._organizationService.hasSuperAdminUser(org.id)) ) { throw new HttpException({ msg: 'Unauthorized' }, 403); diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts index 7dd598008d..0916112b43 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts @@ -2,7 +2,7 @@ import { PrismaRepository } from '@gitroom/nestjs-libraries/database/prisma/pris import { Injectable } from '@nestjs/common'; import { createHash } from 'crypto'; import dayjs from 'dayjs'; -import { Integration } from '@prisma/client'; +import { Integration, Prisma } from '@prisma/client'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { IntegrationTimeDto } from '@gitroom/nestjs-libraries/dtos/integrations/integration.time.dto'; import { UploadFactory } from '@gitroom/nestjs-libraries/upload/upload.factory'; @@ -560,6 +560,42 @@ export class IntegrationRepository { }); } + private async latestPostsFor( + org: string, + state: 'PUBLISHED' | 'ERROR', + field: 'publishDate' | 'updatedAt', + groups: { integrationId: string; date: Date | null }[] + ) { + const matches = groups.filter((group) => group.date); + + if (!matches.length) { + return []; + } + + return this._posts.model.post.findMany({ + where: { + organizationId: org, + state, + deletedAt: null, + OR: matches.map( + (group) => + ({ + integrationId: group.integrationId, + [field]: group.date, + } as Prisma.PostWhereInput) + ), + }, + select: { + id: true, + integrationId: true, + publishDate: true, + updatedAt: true, + releaseURL: true, + error: true, + }, + }); + } + async getChannelHealth(org: string) { const [integrations, lastPublished, lastErrored] = await Promise.all([ this._integration.model.integration.findMany({ @@ -590,43 +626,52 @@ export class IntegrationRepository { }, }, }), - this._posts.model.post.findMany({ + this._posts.model.post.groupBy({ + by: ['integrationId'], where: { organizationId: org, state: 'PUBLISHED', deletedAt: null, }, - orderBy: [{ integrationId: 'asc' }, { publishDate: 'desc' }], - distinct: ['integrationId'], - select: { - id: true, - integrationId: true, - publishDate: true, - releaseURL: true, - }, + _max: { publishDate: true }, }), - this._posts.model.post.findMany({ + this._posts.model.post.groupBy({ + by: ['integrationId'], where: { organizationId: org, state: 'ERROR', deletedAt: null, }, - orderBy: [{ integrationId: 'asc' }, { updatedAt: 'desc' }], - distinct: ['integrationId'], - select: { - id: true, - integrationId: true, - updatedAt: true, - error: true, - }, + _max: { updatedAt: true }, }), ]); + const [publishedPosts, erroredPosts] = await Promise.all([ + this.latestPostsFor( + org, + 'PUBLISHED', + 'publishDate', + lastPublished.map((group) => ({ + integrationId: group.integrationId, + date: group._max.publishDate, + })) + ), + this.latestPostsFor( + org, + 'ERROR', + 'updatedAt', + lastErrored.map((group) => ({ + integrationId: group.integrationId, + date: group._max.updatedAt, + })) + ), + ]); + const publishedByIntegration = new Map( - lastPublished.map((post) => [post.integrationId, post]) + publishedPosts.map((post) => [post.integrationId, post]) ); const erroredByIntegration = new Map( - lastErrored.map((post) => [post.integrationId, post]) + erroredPosts.map((post) => [post.integrationId, post]) ); return integrations.map((integration) => { From 7c2ac9079afe398e730b657b12b61d7e7000ffd4 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Thu, 17 Sep 2026 16:18:50 +0200 Subject: [PATCH 47/61] fix: restrict the debug endpoints to super admins --- .../src/public-api/routes/v1/public.integrations.controller.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts index c6617354b1..ece1ff85ea 100644 --- a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts +++ b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts @@ -322,6 +322,7 @@ export class PublicIntegrationsController { } @Get('/debug/posts/:id') + @UseGuards(SuperAdminGuard) async getPostTimeline( @GetOrgFromRequest() org: Organization, @Param('id') id: string @@ -337,12 +338,14 @@ export class PublicIntegrationsController { } @Get('/debug/channels') + @UseGuards(SuperAdminGuard) async getChannelHealth(@GetOrgFromRequest() org: Organization) { Sentry.metrics.count('public_api-request', 1); return this._integrationService.getChannelHealth(org.id); } @Get('/debug/activity') + @UseGuards(SuperAdminGuard) async getOrgActivity( @GetOrgFromRequest() org: Organization, @Query() query: GetOrgActivityDto From a1db9359ac62f976c006afb09c7132f4b318ac73 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Thu, 17 Sep 2026 16:25:19 +0200 Subject: [PATCH 48/61] feat: add account overview debug endpoint for dispute evidence --- .../v1/public.integrations.controller.ts | 17 +++- .../organizations/organization.repository.ts | 92 +++++++++++++++++++ .../organizations/organization.service.ts | 4 + 3 files changed, 112 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts index ece1ff85ea..b99e31fd99 100644 --- a/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts +++ b/apps/backend/src/public-api/routes/v1/public.integrations.controller.ts @@ -48,6 +48,7 @@ import { SuperAdminGuard } from '@gitroom/backend/services/auth/super.admin.guar import { timer } from '@gitroom/helpers/utils/timer'; import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; import { AdminStatsService } from '@gitroom/nestjs-libraries/database/prisma/admin-stats/admin-stats.service'; +import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; import { GetOrgActivityDto } from '@gitroom/nestjs-libraries/dtos/analytics/get.org.activity.dto'; import dayjs from 'dayjs'; @@ -62,7 +63,8 @@ export class PublicIntegrationsController { private _integrationManager: IntegrationManager, private _refreshIntegrationService: RefreshIntegrationService, private _usersService: UsersService, - private _adminStatsService: AdminStatsService + private _adminStatsService: AdminStatsService, + private _organizationService: OrganizationService ) {} @Post('/upload') @@ -337,6 +339,19 @@ export class PublicIntegrationsController { return timeline; } + @Get('/debug/account') + @UseGuards(SuperAdminGuard) + async getAccountOverview(@GetOrgFromRequest() org: Organization) { + Sentry.metrics.count('public_api-request', 1); + const account = await this._organizationService.getAccountOverview(org.id); + + if (!account) { + throw new HttpException({ msg: 'Organization not found' }, 404); + } + + return account; + } + @Get('/debug/channels') @UseGuards(SuperAdminGuard) async getChannelHealth(@GetOrgFromRequest() org: Organization) { diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts index 3b08182e95..5a92b5e226 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts @@ -287,6 +287,98 @@ export class OrganizationRepository { }); } + async getAccountOverview(orgId: string) { + const [organization, members] = await Promise.all([ + this._organization.model.organization.findUnique({ + where: { + id: orgId, + }, + select: { + id: true, + name: true, + createdAt: true, + deletedAt: true, + allowTrial: true, + isTrailing: true, + subscription: { + select: { + subscriptionTier: true, + period: true, + identifier: true, + totalChannels: true, + isLifetime: true, + cancelAt: true, + createdAt: true, + updatedAt: true, + deletedAt: true, + }, + }, + }, + }), + this._userOrg.model.userOrganization.findMany({ + where: { + organizationId: orgId, + }, + orderBy: { + createdAt: 'asc', + }, + select: { + role: true, + disabled: true, + createdAt: true, + user: { + select: { + id: true, + email: true, + activated: true, + providerName: true, + lastOnline: true, + createdAt: true, + }, + }, + }, + }), + ]); + + if (!organization) { + return null; + } + + const owner = members.find((member) => member.role === Role.SUPERADMIN); + const lastOnlineMax = members.reduce( + (latest, member) => + !latest || member.user.lastOnline > latest + ? member.user.lastOnline + : latest, + null + ); + + return { + organization: { + id: organization.id, + name: organization.name, + createdAt: organization.createdAt, + deletedAt: organization.deletedAt, + allowTrial: organization.allowTrial, + isTrailing: organization.isTrailing, + }, + subscription: organization.subscription || null, + owner: owner + ? { + ...owner.user, + role: owner.role, + memberSince: owner.createdAt, + } + : null, + users: { + total: members.length, + activated: members.filter((member) => member.user.activated).length, + disabled: members.filter((member) => member.disabled).length, + lastOnlineMax, + }, + }; + } + getUsersByEmail(email: string) { return this._user.model.user.findMany({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts index a5b62517c4..95e4dc620f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts @@ -55,6 +55,10 @@ export class OrganizationService { return this._organizationRepository.getOrgByIdWithSubscription(id); } + getAccountOverview(orgId: string) { + return this._organizationRepository.getAccountOverview(orgId); + } + getOrgByApiKey(api: string) { return this._organizationRepository.getOrgByApiKey(api); } From 82a10abd0f7a2b0d74d968b8c05017671b8ac211 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Thu, 17 Sep 2026 16:31:02 +0200 Subject: [PATCH 49/61] fix: require every privileged member of an admin org to be a superuser --- .../src/services/auth/public.auth.middleware.ts | 2 +- .../src/services/auth/super.admin.guard.ts | 2 +- .../organizations/organization.repository.ts | 16 ++++++++++++++++ .../prisma/organizations/organization.service.ts | 9 +++++++-- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/apps/backend/src/services/auth/public.auth.middleware.ts b/apps/backend/src/services/auth/public.auth.middleware.ts index 6c0b44301e..b02365ba5e 100644 --- a/apps/backend/src/services/auth/public.auth.middleware.ts +++ b/apps/backend/src/services/auth/public.auth.middleware.ts @@ -68,7 +68,7 @@ export class PublicAuthMiddleware implements NestMiddleware { if (overrideOrgId) { if ( isOAuthApp || - !(await this._organizationService.hasSuperAdminUser(org.id)) + !(await this._organizationService.canUseSuperAdminApi(org.id)) ) { res.status(HttpStatus.FORBIDDEN).json({ msg: 'Unauthorized' }); return; diff --git a/apps/backend/src/services/auth/super.admin.guard.ts b/apps/backend/src/services/auth/super.admin.guard.ts index fb2a46409d..ded50f99d1 100644 --- a/apps/backend/src/services/auth/super.admin.guard.ts +++ b/apps/backend/src/services/auth/super.admin.guard.ts @@ -22,7 +22,7 @@ export class SuperAdminGuard implements CanActivate { if ( !org || isOAuthApp || - !(await this._organizationService.hasSuperAdminUser(org.id)) + !(await this._organizationService.canUseSuperAdminApi(org.id)) ) { throw new HttpException({ msg: 'Unauthorized' }, 403); } diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts index 5a92b5e226..584317afc4 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts @@ -87,6 +87,22 @@ export class OrganizationRepository { }); } + getPrivilegedNonSuperAdminUser(orgId: string) { + return this._userOrg.model.userOrganization.findFirst({ + where: { + organizationId: orgId, + disabled: false, + role: { + in: [Role.SUPERADMIN, Role.ADMIN], + }, + user: { + isSuperAdmin: false, + deletedAt: null, + }, + }, + }); + } + getUserOrg(id: string) { return this._userOrg.model.userOrganization.findFirst({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts index 95e4dc620f..dae6677e47 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts @@ -63,8 +63,13 @@ export class OrganizationService { return this._organizationRepository.getOrgByApiKey(api); } - async hasSuperAdminUser(orgId: string) { - return !!(await this._organizationRepository.getSuperAdminUser(orgId)); + async canUseSuperAdminApi(orgId: string) { + const [superAdmin, privilegedOther] = await Promise.all([ + this._organizationRepository.getSuperAdminUser(orgId), + this._organizationRepository.getPrivilegedNonSuperAdminUser(orgId), + ]); + + return !!superAdmin && !privilegedOther; } getUserOrg(id: string) { From 246c3c03965b509806bb299c15464bde6ffe8f0d Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Thu, 17 Sep 2026 16:59:57 +0200 Subject: [PATCH 50/61] fix: authorize the super admin guard against the calling organization --- .../src/services/auth/public.auth.middleware.ts | 2 ++ apps/backend/src/services/auth/super.admin.guard.ts | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/backend/src/services/auth/public.auth.middleware.ts b/apps/backend/src/services/auth/public.auth.middleware.ts index b02365ba5e..96f2b11de8 100644 --- a/apps/backend/src/services/auth/public.auth.middleware.ts +++ b/apps/backend/src/services/auth/public.auth.middleware.ts @@ -62,6 +62,8 @@ export class PublicAuthMiddleware implements NestMiddleware { } this.setOrg(req, org); + // @ts-ignore + req.authOrgId = org.id; const overrideOrgId = (req.headers['x-postiz-org'] as string)?.trim(); diff --git a/apps/backend/src/services/auth/super.admin.guard.ts b/apps/backend/src/services/auth/super.admin.guard.ts index ded50f99d1..b52e5c44a2 100644 --- a/apps/backend/src/services/auth/super.admin.guard.ts +++ b/apps/backend/src/services/auth/super.admin.guard.ts @@ -16,13 +16,19 @@ export class SuperAdminGuard implements CanActivate { const request: Request = context.switchToHttp().getRequest(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error - const { org, isOAuthApp }: { org: Organization; isOAuthApp?: boolean } = + const { + org, + isOAuthApp, + authOrgId, + }: { org: Organization; isOAuthApp?: boolean; authOrgId?: string } = request; + const orgId = authOrgId || org?.id; + if ( - !org || + !orgId || isOAuthApp || - !(await this._organizationService.canUseSuperAdminApi(org.id)) + !(await this._organizationService.canUseSuperAdminApi(orgId)) ) { throw new HttpException({ msg: 'Unauthorized' }, 403); } From aee9859725c9caa69f954f45fc189db4ad4ab574 Mon Sep 17 00:00:00 2001 From: Enno Gelhaus Date: Thu, 17 Sep 2026 17:09:04 +0200 Subject: [PATCH 51/61] fix: make channel health pick one deterministic top-level post per channel --- .../integrations/integration.repository.ts | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts index 0916112b43..8b2ba3536f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts @@ -564,6 +564,7 @@ export class IntegrationRepository { org: string, state: 'PUBLISHED' | 'ERROR', field: 'publishDate' | 'updatedAt', + topLevelOnly: boolean, groups: { integrationId: string; date: Date | null }[] ) { const matches = groups.filter((group) => group.date); @@ -577,6 +578,7 @@ export class IntegrationRepository { organizationId: org, state, deletedAt: null, + ...(topLevelOnly ? { parentPostId: null } : {}), OR: matches.map( (group) => ({ @@ -585,6 +587,9 @@ export class IntegrationRepository { } as Prisma.PostWhereInput) ), }, + orderBy: { + id: 'asc', + }, select: { id: true, integrationId: true, @@ -596,6 +601,18 @@ export class IntegrationRepository { }); } + private firstPerIntegration(posts: T[]) { + const byIntegration = new Map(); + + for (const post of posts) { + if (!byIntegration.has(post.integrationId)) { + byIntegration.set(post.integrationId, post); + } + } + + return byIntegration; + } + async getChannelHealth(org: string) { const [integrations, lastPublished, lastErrored] = await Promise.all([ this._integration.model.integration.findMany({ @@ -632,6 +649,7 @@ export class IntegrationRepository { organizationId: org, state: 'PUBLISHED', deletedAt: null, + parentPostId: null, }, _max: { publishDate: true }, }), @@ -651,6 +669,7 @@ export class IntegrationRepository { org, 'PUBLISHED', 'publishDate', + true, lastPublished.map((group) => ({ integrationId: group.integrationId, date: group._max.publishDate, @@ -660,6 +679,7 @@ export class IntegrationRepository { org, 'ERROR', 'updatedAt', + false, lastErrored.map((group) => ({ integrationId: group.integrationId, date: group._max.updatedAt, @@ -667,12 +687,8 @@ export class IntegrationRepository { ), ]); - const publishedByIntegration = new Map( - publishedPosts.map((post) => [post.integrationId, post]) - ); - const erroredByIntegration = new Map( - erroredPosts.map((post) => [post.integrationId, post]) - ); + const publishedByIntegration = this.firstPerIntegration(publishedPosts); + const erroredByIntegration = this.firstPerIntegration(erroredPosts); return integrations.map((integration) => { const published = publishedByIntegration.get(integration.id); From 6b40c6447ccf3fb2f9ffbc8c9c54dfc6286a8588 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 23:13:12 +0700 Subject: [PATCH 52/61] fix(chat): run the Mastra storage migration at boot with a retry @mastra/pg checks for a column against a schema snapshot and then runs a plain ALTER TABLE ADD COLUMN, so instances migrating at the same time race and the loser throws 'column "organizationId" ... already exists' into the first user request. Init now runs when the Mastra instance is created and retries once against the already migrated schema. Co-Authored-By: Claude Fable 5.1 --- libraries/nestjs-libraries/src/chat/mastra.service.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/chat/mastra.service.ts b/libraries/nestjs-libraries/src/chat/mastra.service.ts index 27f1b0a367..b40e3f9ace 100644 --- a/libraries/nestjs-libraries/src/chat/mastra.service.ts +++ b/libraries/nestjs-libraries/src/chat/mastra.service.ts @@ -1,7 +1,7 @@ import { Mastra } from '@mastra/core/mastra'; import { ConsoleLogger } from '@mastra/core/logger'; import { pStore } from '@gitroom/nestjs-libraries/chat/mastra.store'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { LoadToolsService } from '@gitroom/nestjs-libraries/chat/load.tools.service'; @Injectable() @@ -9,6 +9,15 @@ export class MastraService { static mastra: Mastra; constructor(private _loadToolsService: LoadToolsService) {} async mastra() { + if (!MastraService.mastra) { + // @mastra/pg migrates its tables on first use, when a few instances boot together + // the ADD COLUMN can race, the retry runs against the already migrated schema + await pStore + .init() + .catch(() => pStore.init()) + .catch((err) => Logger.warn(`Mastra storage init failed: ${err}`)); + } + MastraService.mastra = MastraService.mastra || new Mastra({ From e9245cad7d6be6457b734c7ced65968d5f74e323 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 23:16:29 +0700 Subject: [PATCH 53/61] fix(prisma): mirror every Mastra 1.67 table and column in schema.prisma prisma-db-push runs with --accept-data-loss on deploy, so anything Mastra created that the schema did not mirror (37 tables, 31 columns) was dropped and rebuilt by @mastra/pg on the next boot, which is where instances raced on ALTER TABLE ADD COLUMN. The mastra_* models are now introspected from a database migrated by @mastra/pg 1.25, so db push creates them before the backend starts and Mastra's init finds nothing to alter. Existing mirrored columns are unchanged; migrate diff against a migrated DB is empty. Co-Authored-By: Claude Fable 5.1 --- .../src/database/prisma/schema.prisma | 817 +++++++++++++++++- 1 file changed, 795 insertions(+), 22 deletions(-) diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index 941e27a8d4..706940a112 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -694,32 +694,67 @@ model Mentions { /// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model mastra_ai_spans { - traceId String - spanId String - parentSpanId String? - name String - scope Json? - spanType String - attributes Json? - metadata Json? - links Json? - input Json? - output Json? - error Json? - startedAt DateTime @db.Timestamp(6) - endedAt DateTime? @db.Timestamp(6) - createdAt DateTime @db.Timestamp(6) - updatedAt DateTime? @db.Timestamp(6) - isEvent Boolean - startedAtZ DateTime? @default(now()) @db.Timestamptz(6) - endedAtZ DateTime? @default(now()) @db.Timestamptz(6) - createdAtZ DateTime? @default(now()) @db.Timestamptz(6) - updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) - + traceId String + spanId String + parentSpanId String? + name String + scope Json? + spanType String + attributes Json? + metadata Json? + links Json? + input Json? + output Json? + error Json? + startedAt DateTime @db.Timestamp(6) + endedAt DateTime? @db.Timestamp(6) + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime? @db.Timestamp(6) + isEvent Boolean + startedAtZ DateTime? @default(now()) @db.Timestamptz(6) + endedAtZ DateTime? @default(now()) @db.Timestamptz(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + entityType String? + entityId String? + entityName String? + parentEntityType String? + parentEntityId String? + parentEntityName String? + rootEntityType String? + rootEntityId String? + rootEntityName String? + userId String? + organizationId String? + resourceId String? + runId String? + sessionId String? + threadId String? + requestId String? + environment String? + serviceName String? + experimentId String? + source String? + tags Json? + requestContext Json? + entityVersionId String? + parentEntityVersionId String? + rootEntityVersionId String? + + @@id([traceId, spanId], map: "public_mastra_ai_spans_traceid_spanid_pk") @@index([name], map: "public_mastra_ai_spans_name_idx") @@index([parentSpanId, startedAt(sort: Desc)], map: "public_mastra_ai_spans_parentspanid_startedat_idx") @@index([spanType, startedAt(sort: Desc)], map: "public_mastra_ai_spans_spantype_startedat_idx") @@index([traceId, startedAt(sort: Desc)], map: "public_mastra_ai_spans_traceid_startedat_idx") + @@index([entityType, entityId], map: "mastra_ai_spans_entitytype_entityid_idx") + @@index([entityType, entityName], map: "mastra_ai_spans_entitytype_entityname_idx") + @@index([metadata], map: "mastra_ai_spans_metadata_gin_idx", type: Gin) + @@index([name]) + @@index([organizationId, userId], map: "mastra_ai_spans_orgid_userid_idx") + @@index([parentSpanId, startedAt(sort: Desc)], map: "mastra_ai_spans_parentspanid_startedat_idx") + @@index([spanType, startedAt(sort: Desc)], map: "mastra_ai_spans_spantype_startedat_idx") + @@index([tags], map: "mastra_ai_spans_tags_gin_idx", type: Gin) + @@index([traceId, startedAt(sort: Desc)], map: "mastra_ai_spans_traceid_startedat_idx") @@ignore } @@ -754,6 +789,7 @@ model mastra_messages { createdAtZ DateTime? @default(now()) @db.Timestamptz(6) @@index([thread_id, createdAt(sort: Desc)], map: "public_mastra_messages_thread_id_createdat_idx") + @@index([thread_id, createdAt(sort: Desc)], map: "mastra_messages_thread_id_createdat_idx") } model mastra_resources { @@ -799,8 +835,15 @@ model mastra_scorers { createdAtZ DateTime? @default(now()) @db.Timestamptz(6) updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) spanId String? + requestContext Json? + organizationId String? + projectId String? + batchId String? + datasetId String? + datasetItemId String? @@index([traceId, spanId, createdAt(sort: Desc)], map: "public_mastra_scores_trace_id_span_id_created_at_idx") + @@index([traceId, spanId, createdAt(sort: Desc)], map: "mastra_scores_trace_id_span_id_created_at_idx") } model mastra_threads { @@ -814,6 +857,7 @@ model mastra_threads { updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) @@index([resourceId, createdAt(sort: Desc)], map: "public_mastra_threads_resourceid_createdat_idx") + @@index([resourceId, createdAt(sort: Desc)], map: "mastra_threads_resourceid_createdat_idx") } model mastra_traces { @@ -847,6 +891,735 @@ model mastra_workflow_snapshot { updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) @@unique([workflow_name, run_id], map: "public_mastra_workflow_snapshot_workflow_name_run_id_key") + @@index([workflow_name, createdAt(sort: Desc)], map: "mastra_workflow_snapshot_name_createdat_idx") +} + +model mastra_agent_versions { + id String @id + agentId String + versionNumber Int + name String + description String? + instructions String + model Json + tools Json? + defaultOptions Json? + workflows Json? + agents Json? + integrationTools Json? + inputProcessors Json? + outputProcessors Json? + memory Json? + scorers Json? + mcpClients Json? + requestContextSchema Json? + workspace Json? + skills Json? + skillsFormat String? + changedFields Json? + changeMessage String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + durable Json? + browser Json? + toolProviders Json? +} + +model mastra_agents { + id String @id + status String + activeVersionId String? + authorId String? + metadata Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + visibility String? + favoriteCount Int? +} + +model mastra_background_tasks { + id String @id + tool_call_id String + tool_name String + agent_id String + run_id String + thread_id String? + resource_id String? + status String + args Json + result Json? + error Json? + suspend_payload Json? + retry_count Int + max_retries Int + timeout_ms Int + createdAt DateTime @db.Timestamp(6) + startedAt DateTime? @db.Timestamp(6) + suspendedAt DateTime? @db.Timestamp(6) + completedAt DateTime? @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + startedAtZ DateTime? @default(now()) @db.Timestamptz(6) + suspendedAtZ DateTime? @default(now()) @db.Timestamptz(6) + completedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([agent_id, status], map: "mastra_bg_tasks_agent_status_idx") + @@index([status, createdAt], map: "mastra_bg_tasks_status_created_at_idx") + @@index([thread_id, createdAt], map: "mastra_bg_tasks_thread_idx") + @@index([tool_call_id], map: "mastra_bg_tasks_tool_call_idx") +} + +model mastra_channel_config { + platform String @id + data Json + updatedAt DateTime @db.Timestamp(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) +} + +model mastra_channel_installations { + id String @id + platform String + agentId String + status String + webhookId String? @unique(map: "idx_channel_installations_webhook") + data Json + configHash String? + error String? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([platform, agentId], map: "idx_channel_installations_platform_agent") +} + +model mastra_dataset_items { + id String + datasetId String + datasetVersion Int + validTo Int? + isDeleted Boolean + input Json + groundTruth Json? + requestContext Json? + metadata Json? + source Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + expectedTrajectory Json? + organizationId String? + projectId String? + toolMocks Json? + unmockedToolPolicy String? + scorerIds Json? + externalId String? + + @@id([id, datasetVersion]) + @@index([datasetId, validTo], map: "idx_dataset_items_dataset_validto") + @@index([datasetId, validTo, isDeleted], map: "idx_dataset_items_dataset_validto_deleted") + @@index([datasetId, datasetVersion], map: "idx_dataset_items_dataset_version") + @@index([datasetId, externalId, datasetVersion], map: "idx_dataset_items_external_id_history") + @@index([organizationId, projectId], map: "idx_dataset_items_org_project") +} + +model mastra_dataset_versions { + id String @id + datasetId String + version Int + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@unique([datasetId, version], map: "idx_dataset_versions_dataset_version_unique") + @@index([datasetId, version], map: "idx_dataset_versions_dataset_version") +} + +model mastra_datasets { + id String @id + name String + description String? + metadata Json? + inputSchema Json? + groundTruthSchema Json? + requestContextSchema Json? + tags Json? + targetType String? + targetIds Json? + scorerIds Json? + version Int + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + organizationId String? + projectId String? + candidateKey String? + candidateId String? + + @@index([candidateKey, candidateId], map: "idx_datasets_candidate") + @@index([organizationId, projectId], map: "idx_datasets_org_project") +} + +model mastra_experiment_results { + id String @id + experimentId String + itemId String + itemDatasetVersion Int? + input Json + output Json? + groundTruth Json? + error Json? + startedAt DateTime @db.Timestamp(6) + completedAt DateTime @db.Timestamp(6) + retryCount Int + traceId String? + status String? + tags Json? + createdAt DateTime @db.Timestamp(6) + startedAtZ DateTime? @default(now()) @db.Timestamptz(6) + completedAtZ DateTime? @default(now()) @db.Timestamptz(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + comment String? + toolMockReport Json? + metadata Json? + organizationId String? + projectId String? + attempt Int? + + @@unique([experimentId, itemId, attempt], map: "idx_experiment_results_exp_item_attempt") + @@index([experimentId], map: "idx_experiment_results_experimentid") + @@index([organizationId, projectId], map: "idx_experiment_results_org_project") + @@index([tags], map: "idx_experiment_results_tags_gin", type: Gin) +} + +model mastra_experiments { + id String @id + name String? + description String? + metadata Json? + datasetId String? + datasetVersion Int? + targetType String + targetId String + status String + totalItems Int + succeededCount Int + failedCount Int + skippedCount Int + startedAt DateTime? @db.Timestamp(6) + completedAt DateTime? @db.Timestamp(6) + agentVersion String? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + startedAtZ DateTime? @default(now()) @db.Timestamptz(6) + completedAtZ DateTime? @default(now()) @db.Timestamptz(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + organizationId String? + projectId String? + provenance Json? + runnerAttestation Json? + experimentSetId String? + comparisonId String? + variantId String? + trialIndex Int? + scorerIds Json? + + @@index([datasetId], map: "idx_experiments_datasetid") + @@index([experimentSetId, comparisonId, variantId, trialIndex], map: "idx_experiments_grouping") + @@index([organizationId, projectId], map: "idx_experiments_org_project") +} + +model mastra_favorites { + userId String + entityType String + entityId String + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@id([userId, entityType, entityId]) + @@index([entityType, entityId], map: "idx_favorites_entity") +} + +model mastra_knowledge_activity { + id String @id + action String + recordType String + recordId String + scope Json + scopeKey String + sourceThreadId String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([id(sort: Desc)], map: "idx_knowledge_activity_latest") +} + +model mastra_knowledge_cursors { + sourceThreadId String + agent String + lastKnowledgeId String + updatedAt DateTime @db.Timestamp(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@id([sourceThreadId, agent]) +} + +model mastra_knowledge_mentions { + sourceType String + sourceId String + recordId String + + @@id([sourceType, sourceId, recordId]) + @@index([recordId, sourceType, sourceId], map: "idx_knowledge_mentions_record") +} + +model mastra_knowledge_nodes { + id String @id + type String + name String + canonicalName String + kind String? + content String? + description String? + scope Json + scopeKey String + version Int + mergedInto String? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@unique([type, scopeKey, canonicalName], map: "idx_knowledge_nodes_identity") + @@index([scopeKey, type], map: "idx_knowledge_nodes_scope") +} + +model mastra_knowledge_records { + id String @id + node String + text String + scope Json + scopeKey String + sourceThreadId String + capturedAt DateTime @db.Timestamp(6) + when DateTime? @db.Timestamp(6) + maxScope String? + metadata Json? + deletedAt DateTime? @db.Timestamp(6) + deletedBy String? + capturedAtZ DateTime? @default(now()) @db.Timestamptz(6) + whenZ DateTime? @default(now()) @db.Timestamptz(6) + deletedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([node, id(sort: Desc)], map: "idx_knowledge_records_node_latest") + @@index([sourceThreadId, id(sort: Desc)], map: "idx_knowledge_records_thread_latest") +} + +model mastra_knowledge_semantic_outbox { + id String @id + idempotencyKey String @unique(map: "idx_knowledge_outbox_idempotency") + documentId String + documentType String + operation String + scope Json + scopeKey String + status String + attempts Int + availableAt DateTime @db.Timestamp(6) + claimedAt DateTime? @db.Timestamp(6) + claimedBy String? + createdAt DateTime @db.Timestamp(6) + completedAt DateTime? @db.Timestamp(6) + availableAtZ DateTime? @default(now()) @db.Timestamptz(6) + claimedAtZ DateTime? @default(now()) @db.Timestamptz(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + completedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([status, availableAt, createdAt], map: "idx_knowledge_outbox_claim") +} + +model mastra_mcp_client_versions { + id String @id + mcpClientId String + versionNumber Int + name String + description String? + servers Json + changedFields Json? + changeMessage String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@unique([mcpClientId, versionNumber], map: "idx_mcp_client_versions_client_version") +} + +model mastra_mcp_clients { + id String @id + status String + activeVersionId String? + authorId String? + metadata Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) +} + +model mastra_mcp_server_versions { + id String @id + mcpServerId String + versionNumber Int + name String + version String + description String? + instructions String? + repository Json? + releaseDate String? + isLatest Boolean? + packageCanonical String? + tools Json? + agents Json? + workflows Json? + changedFields Json? + changeMessage String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@unique([mcpServerId, versionNumber], map: "idx_mcp_server_versions_server_version") +} + +model mastra_mcp_servers { + id String @id + status String + activeVersionId String? + authorId String? + metadata Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) +} + +/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. +model mastra_notifications { + id String + threadId String + source String + kind String + priority String + status String + summary String + payload Json? + resourceId String? + agentId String? + sourceId String? + dedupeKey String? + coalesceKey String? + coalescedCount Int + attributes Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + deliveredAt DateTime? @db.Timestamp(6) + seenAt DateTime? @db.Timestamp(6) + dismissedAt DateTime? @db.Timestamp(6) + archivedAt DateTime? @db.Timestamp(6) + discardedAt DateTime? @db.Timestamp(6) + deliverAt DateTime? @db.Timestamp(6) + summaryAt DateTime? @db.Timestamp(6) + deliveryReason String? + deliveryAttempts Int + lastDeliveryAttemptAt DateTime? @db.Timestamp(6) + lastDeliveryError String? + deliveredSignalId String? + summarySignalId String? + metadata Json? + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + deliveredAtZ DateTime? @default(now()) @db.Timestamptz(6) + seenAtZ DateTime? @default(now()) @db.Timestamptz(6) + dismissedAtZ DateTime? @default(now()) @db.Timestamptz(6) + archivedAtZ DateTime? @default(now()) @db.Timestamptz(6) + discardedAtZ DateTime? @default(now()) @db.Timestamptz(6) + deliverAtZ DateTime? @default(now()) @db.Timestamptz(6) + summaryAtZ DateTime? @default(now()) @db.Timestamptz(6) + lastDeliveryAttemptAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([threadId, source, kind, status, agentId, resourceId, dedupeKey, coalesceKey], map: "idx_notifications_coalescing") + @@index([status, deliverAt, summaryAt], map: "idx_notifications_due") + @@index([threadId, status, updatedAt], map: "idx_notifications_thread_status_updated") + @@ignore +} + +model mastra_observational_memory { + id String @id + lookupKey String + scope String + resourceId String? + threadId String? + activeObservations String + activeObservationsPendingUpdate String? + originType String + config String + generationCount Int + lastObservedAt DateTime? @db.Timestamp(6) + lastReflectionAt DateTime? @db.Timestamp(6) + pendingMessageTokens Int + totalTokensObserved Int + observationTokenCount Int + isObserving Boolean + isReflecting Boolean + observedMessageIds Json? + observedTimezone String? + bufferedObservations String? + bufferedObservationTokens Int? + bufferedMessageIds Json? + bufferedReflection String? + bufferedReflectionTokens Int? + bufferedReflectionInputTokens Int? + reflectedObservationLineCount Int? + bufferedObservationChunks Json? + isBufferingObservation Boolean + isBufferingReflection Boolean + lastBufferedAtTokens Int + lastBufferedAtTime DateTime? @db.Timestamp(6) + metadata Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + lastObservedAtZ DateTime? @default(now()) @db.Timestamptz(6) + lastReflectionAtZ DateTime? @default(now()) @db.Timestamptz(6) + lastBufferedAtTimeZ DateTime? @default(now()) @db.Timestamptz(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([lookupKey], map: "idx_om_lookup_key") +} + +model mastra_prompt_block_versions { + id String @id + blockId String + versionNumber Int + name String + description String? + content String + rules Json? + requestContextSchema Json? + changedFields Json? + changeMessage String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@unique([blockId, versionNumber], map: "idx_prompt_block_versions_block_version") +} + +model mastra_prompt_blocks { + id String @id + status String + activeVersionId String? + authorId String? + metadata Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) +} + +model mastra_schedule_triggers { + id String @id + schedule_id String + run_id String? + scheduled_fire_at BigInt + actual_fire_at BigInt + outcome String + error String? + trigger_kind String + parent_trigger_id String? + metadata Json? + + @@index([schedule_id, actual_fire_at(sort: Desc)], map: "idx_mastra_schedule_triggers_schedule_fire") +} + +model mastra_schedules { + id String @id + target Json + cron String + timezone String? + status String + next_fire_at BigInt + last_fire_at BigInt? + last_run_id String? + created_at BigInt + updated_at BigInt + metadata Json? + owner_type String? + owner_id String? + + @@index([status, next_fire_at], map: "idx_mastra_schedules_status_next_fire") +} + +model mastra_scorer_definition_versions { + id String @id + scorerDefinitionId String + versionNumber Int + name String + description String? + type String + model Json? + instructions String? + scoreRange Json? + presetConfig Json? + defaultSampling Json? + changedFields Json? + changeMessage String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@unique([scorerDefinitionId, versionNumber], map: "idx_scorer_definition_versions_def_version") +} + +model mastra_scorer_definitions { + id String @id + status String + activeVersionId String? + authorId String? + metadata Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + organizationId String? + projectId String? +} + +model mastra_skill_blobs { + hash String @id + content String + size Int + mimeType String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) +} + +model mastra_skill_versions { + id String @id + skillId String + versionNumber Int + name String + description String + instructions String + license String? + compatibility Json? + source Json? + references Json? + scripts Json? + assets Json? + metadata Json? + tree Json? + changedFields Json? + changeMessage String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + files Json? + + @@unique([skillId, versionNumber], map: "idx_skill_versions_skill_version") +} + +model mastra_skills { + id String @id + status String + activeVersionId String? + authorId String? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + visibility String? + favoriteCount Int? +} + +model mastra_thread_state { + threadId String + type String + value Json + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@id([threadId, type]) +} + +model mastra_tool_provider_connections { + authorId String + providerId String + connectionId String + toolkit String + label String? + scope String + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@id([authorId, providerId, connectionId]) + @@index([authorId, providerId, toolkit], map: "idx_tool_provider_connections_author") +} + +model mastra_workflow_definitions { + id String @id + description String? + metadata Json? + inputSchema Json + outputSchema Json + stateSchema Json? + requestContextSchema Json? + graph Json + schedule Json? + status String + source String + authorId String? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@index([status], map: "idx_workflow_definitions_status") +} + +model mastra_workspace_versions { + id String @id + workspaceId String + versionNumber Int + name String + description String? + filesystem Json? + sandbox Json? + mounts Json? + search Json? + skills Json? + tools Json? + autoSync Boolean? + operationTimeout Int? + changedFields Json? + changeMessage String? + createdAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + + @@unique([workspaceId, versionNumber], map: "idx_workspace_versions_workspace_version") +} + +model mastra_workspaces { + id String @id + status String + activeVersionId String? + authorId String? + metadata Json? + createdAt DateTime @db.Timestamp(6) + updatedAt DateTime @db.Timestamp(6) + createdAtZ DateTime? @default(now()) @db.Timestamptz(6) + updatedAtZ DateTime? @default(now()) @db.Timestamptz(6) } model OAuthApp { From 1207941bb9002743f7cc89846fe1c633f50c1a6a Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 17 Sep 2026 23:20:39 +0700 Subject: [PATCH 54/61] revert(chat): drop the boot-time Mastra storage init The mastra_* tables are now mirrored in schema.prisma, so prisma db push creates them before the backend starts and the init race cannot happen. Co-Authored-By: Claude Fable 5.1 --- libraries/nestjs-libraries/src/chat/mastra.service.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/libraries/nestjs-libraries/src/chat/mastra.service.ts b/libraries/nestjs-libraries/src/chat/mastra.service.ts index b40e3f9ace..27f1b0a367 100644 --- a/libraries/nestjs-libraries/src/chat/mastra.service.ts +++ b/libraries/nestjs-libraries/src/chat/mastra.service.ts @@ -1,7 +1,7 @@ import { Mastra } from '@mastra/core/mastra'; import { ConsoleLogger } from '@mastra/core/logger'; import { pStore } from '@gitroom/nestjs-libraries/chat/mastra.store'; -import { Injectable, Logger } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { LoadToolsService } from '@gitroom/nestjs-libraries/chat/load.tools.service'; @Injectable() @@ -9,15 +9,6 @@ export class MastraService { static mastra: Mastra; constructor(private _loadToolsService: LoadToolsService) {} async mastra() { - if (!MastraService.mastra) { - // @mastra/pg migrates its tables on first use, when a few instances boot together - // the ADD COLUMN can race, the retry runs against the already migrated schema - await pStore - .init() - .catch(() => pStore.init()) - .catch((err) => Logger.warn(`Mastra storage init failed: ${err}`)); - } - MastraService.mastra = MastraService.mastra || new Mastra({ From 2c29ea3eeb66c34698bb8d2ab45aec6fc539f8d3 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Fri, 18 Sep 2026 15:09:35 +0700 Subject: [PATCH 55/61] feat(mcp): upload widget for uploading local files from Claude and ChatGPT MCP has no way to send a file from the user's device, so add an MCP Apps (SEP-1865) widget: uploadWidgetTool renders ui://postiz/upload, the widget gets a short-lived ticket through the app-only uploadWidgetTicketTool and posts the file to /media-widget/upload, then reports the media back to the model. uploadWidgetStatusTool is the host-independent fallback. The widget tools are mcpOnly, so the in-app agent keeps its current toolset. Co-Authored-By: Claude Fable 5.1 --- apps/backend/src/api/api.module.ts | 7 +- .../src/api/routes/media.widget.controller.ts | 48 ++++ .../auth/upload.widget.auth.middleware.ts | 34 +++ chatgpt-app-submission.json | 36 +++ .../src/chat/agent.tool.interface.ts | 2 + .../src/chat/load.tools.service.ts | 9 +- .../nestjs-libraries/src/chat/start.mcp.ts | 30 ++- .../src/chat/tools/tool.list.ts | 6 + .../chat/tools/upload.widget.status.tool.ts | 72 +++++ .../chat/tools/upload.widget.ticket.tool.ts | 63 +++++ .../src/chat/tools/upload.widget.tool.ts | 57 ++++ .../src/chat/ui/upload.widget.ts | 246 ++++++++++++++++++ .../database/prisma/media/media.service.ts | 74 ++++++ .../src/redis/redis.service.ts | 14 + 14 files changed, 692 insertions(+), 6 deletions(-) create mode 100644 apps/backend/src/api/routes/media.widget.controller.ts create mode 100644 apps/backend/src/services/auth/upload.widget.auth.middleware.ts create mode 100644 libraries/nestjs-libraries/src/chat/tools/upload.widget.status.tool.ts create mode 100644 libraries/nestjs-libraries/src/chat/tools/upload.widget.ticket.tool.ts create mode 100644 libraries/nestjs-libraries/src/chat/tools/upload.widget.tool.ts create mode 100644 libraries/nestjs-libraries/src/chat/ui/upload.widget.ts diff --git a/apps/backend/src/api/api.module.ts b/apps/backend/src/api/api.module.ts index ba1e687e71..52281a5fe3 100644 --- a/apps/backend/src/api/api.module.ts +++ b/apps/backend/src/api/api.module.ts @@ -16,6 +16,8 @@ import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integ import { SettingsController } from '@gitroom/backend/api/routes/settings.controller'; import { PostsController } from '@gitroom/backend/api/routes/posts.controller'; import { MediaController } from '@gitroom/backend/api/routes/media.controller'; +import { MediaWidgetController } from '@gitroom/backend/api/routes/media.widget.controller'; +import { UploadWidgetAuthMiddleware } from '@gitroom/backend/services/auth/upload.widget.auth.middleware'; import { UploadModule } from '@gitroom/nestjs-libraries/upload/upload.module'; import { BillingController } from '@gitroom/backend/api/routes/billing.controller'; import { NotificationsController } from '@gitroom/backend/api/routes/notifications.controller'; @@ -76,7 +78,7 @@ const authenticatedController = [ @Module({ imports: [UploadModule], controllers: process.env.MCP_ONLY - ? [RootController, OAuthController] + ? [RootController, OAuthController, MediaWidgetController] : [ RootController, PaymentController, @@ -87,6 +89,7 @@ const authenticatedController = [ EnterpriseController, NoAuthIntegrationsController, OAuthController, + MediaWidgetController, ...authenticatedController, ], providers: [ @@ -98,6 +101,7 @@ const authenticatedController = [ OpenaiService, ExtractContentService, AuthMiddleware, + UploadWidgetAuthMiddleware, PoliciesGuard, PermissionsService, CodesService, @@ -119,5 +123,6 @@ const authenticatedController = [ export class ApiModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(AuthMiddleware).forRoutes(...authenticatedController); + consumer.apply(UploadWidgetAuthMiddleware).forRoutes(MediaWidgetController); } } diff --git a/apps/backend/src/api/routes/media.widget.controller.ts b/apps/backend/src/api/routes/media.widget.controller.ts new file mode 100644 index 0000000000..c194d4d172 --- /dev/null +++ b/apps/backend/src/api/routes/media.widget.controller.ts @@ -0,0 +1,48 @@ +import { + BadRequestException, + Controller, + Get, + Post, + Req, + UploadedFile, + UseInterceptors, +} from '@nestjs/common'; +import { Request } from 'express'; +import { ApiTags } from '@nestjs/swagger'; +import { Organization } from '@prisma/client'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { streamUploadOptions } from '@gitroom/nestjs-libraries/upload/multer.stream.engine'; + +@ApiTags('Media') +@Controller('/media-widget') +export class MediaWidgetController { + constructor(private _mediaService: MediaService) {} + + @Post('/upload') + @UseInterceptors(FileInterceptor('file', streamUploadOptions())) + async upload( + @GetOrgFromRequest() org: Organization, + @Req() req: Request, + @UploadedFile() file: Express.Multer.File + ) { + if (!file) { + throw new BadRequestException('No file provided'); + } + return this._mediaService.saveUploadSessionFile( + org.id, + // @ts-ignore + req.uploadSession, + file.filename, + file.path, + file.originalname + ); + } + + @Get('/status') + status(@GetOrgFromRequest() org: Organization, @Req() req: Request) { + // @ts-ignore + return this._mediaService.getUploadSession(org.id, req.uploadSession); + } +} diff --git a/apps/backend/src/services/auth/upload.widget.auth.middleware.ts b/apps/backend/src/services/auth/upload.widget.auth.middleware.ts new file mode 100644 index 0000000000..9529cd7290 --- /dev/null +++ b/apps/backend/src/services/auth/upload.widget.auth.middleware.ts @@ -0,0 +1,34 @@ +import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; +import { Request, Response, NextFunction } from 'express'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; + +// The MCP upload widget runs in the host's sandboxed iframe (a foreign origin +// without our cookies), so it authenticates with a short-lived ticket. It is +// checked here, before the multipart interceptor streams anything to storage +@Injectable() +export class UploadWidgetAuthMiddleware implements NestMiddleware { + constructor(private _mediaService: MediaService) {} + async use(req: Request, res: Response, next: NextFunction) { + // Not part of the global cors() allowlist on purpose: that one allows + // credentials, and the sandbox origins are shared with every other connector. + // The global cors() answers every preflight itself, so the widget has to stay + // on "simple" requests (GET / multipart POST, no custom headers) + res.setHeader('Access-Control-Allow-Origin', '*'); + + const ticket = + typeof req.query.ticket === 'string' && + (await this._mediaService.getUploadTicket(req.query.ticket)); + if (!ticket) { + res + .status(HttpStatus.UNAUTHORIZED) + .json({ msg: 'Upload ticket not found or expired' }); + return; + } + + // @ts-ignore + req.org = { id: ticket.org }; + // @ts-ignore + req.uploadSession = ticket.sessionId; + next(); + } +} diff --git a/chatgpt-app-submission.json b/chatgpt-app-submission.json index 82d417524f..5a10433fee 100644 --- a/chatgpt-app-submission.json +++ b/chatgpt-app-submission.json @@ -163,6 +163,42 @@ "open_world_justification": "Reads from a public URL and stores the resulting media through external storage.", "destructive_justification": "Does not delete or overwrite existing media, revoke access, or publish content." } + }, + "uploadWidgetTool": { + "annotations": { + "readOnlyHint": false, + "openWorldHint": false, + "destructiveHint": false + }, + "justifications": { + "read_only_justification": "Opens an upload session and shows a widget the user uploads media to their own media library with.", + "open_world_justification": "Only creates an upload session inside the user's Postiz workspace; nothing is published or sent to a third party.", + "destructive_justification": "Does not delete or overwrite existing media, revoke access, or publish content." + } + }, + "uploadWidgetTicketTool": { + "annotations": { + "readOnlyHint": false, + "openWorldHint": false, + "destructiveHint": false + }, + "justifications": { + "read_only_justification": "Creates a short-lived upload ticket for the upload widget; it is only callable by the widget, not by the model.", + "open_world_justification": "The ticket only allows uploads into the user's own Postiz media library; no public or third-party state changes.", + "destructive_justification": "Does not delete or overwrite anything, revoke access, or publish content." + } + }, + "uploadWidgetStatusTool": { + "annotations": { + "readOnlyHint": true, + "openWorldHint": false, + "destructiveHint": false + }, + "justifications": { + "read_only_justification": "Only reads the media uploaded in an upload widget session.", + "open_world_justification": "Reads internal Postiz data for the user's workspace only.", + "destructive_justification": "Read-only; it cannot change or delete anything." + } } }, "test_cases": [ diff --git a/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts b/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts index 42de607588..e3bea8b468 100644 --- a/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts +++ b/libraries/nestjs-libraries/src/chat/agent.tool.interface.ts @@ -4,5 +4,7 @@ export type ToolReturn = ToolAction; export interface AgentToolInterface { name: string; + // needs an MCP host (e.g. renders a ui:// widget), so the in-app agent doesn't get it + mcpOnly?: boolean; run(): ToolReturn; } diff --git a/libraries/nestjs-libraries/src/chat/load.tools.service.ts b/libraries/nestjs-libraries/src/chat/load.tools.service.ts index a0194b6245..3b14f86fd2 100644 --- a/libraries/nestjs-libraries/src/chat/load.tools.service.ts +++ b/libraries/nestjs-libraries/src/chat/load.tools.service.ts @@ -6,6 +6,7 @@ import { pStore } from '@gitroom/nestjs-libraries/chat/mastra.store'; import { array, object, string } from 'zod'; import { ModuleRef } from '@nestjs/core'; import { toolList } from '@gitroom/nestjs-libraries/chat/tools/tool.list'; +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; import dayjs from 'dayjs'; export const AgentState = object({ @@ -21,11 +22,15 @@ const renderArray = (list: string[], show: boolean) => { export class LoadToolsService { constructor(private _moduleRef: ModuleRef) {} - async loadTools() { + async loadTools(mcpOnly = false) { return ( await Promise.all<{ name: string; tool: any }>( toolList - .map((p) => this._moduleRef.get(p, { strict: false })) + .map( + (p) => + this._moduleRef.get(p, { strict: false }) as AgentToolInterface + ) + .filter((p) => !!p.mcpOnly === mcpOnly) .map(async (p) => ({ name: p.name as string, tool: await p.run(), diff --git a/libraries/nestjs-libraries/src/chat/start.mcp.ts b/libraries/nestjs-libraries/src/chat/start.mcp.ts index 3c28f38c4b..03ae71aee6 100644 --- a/libraries/nestjs-libraries/src/chat/start.mcp.ts +++ b/libraries/nestjs-libraries/src/chat/start.mcp.ts @@ -1,11 +1,13 @@ import { INestApplication } from '@nestjs/common'; import { Request, Response } from 'express'; import { MastraService } from '@gitroom/nestjs-libraries/chat/mastra.service'; +import { LoadToolsService } from '@gitroom/nestjs-libraries/chat/load.tools.service'; import { MCPServer } from '@mastra/mcp'; import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; import { OAuthService } from '@gitroom/nestjs-libraries/database/prisma/oauth/oauth.service'; import { runWithContext } from './async.storage'; import { createOAuthMiddleware } from './oauth-middleware'; +import { UPLOAD_WIDGET_URI, uploadWidgetHtml } from '@gitroom/nestjs-libraries/chat/ui/upload.widget'; const fixAcceptHeader = (req: Request) => { const value = 'application/json, text/event-stream'; req.headers.accept = value; @@ -29,6 +31,7 @@ export const startMcp = async (app: INestApplication) => { const mastraService = app.get(MastraService, { strict: false }); const organizationService = app.get(OrganizationService, { strict: false }); const oauthService = app.get(OAuthService, { strict: false }); + const loadToolsService = app.get(LoadToolsService, { strict: false }); const resolveAuth = async (token: string) => { if (token.startsWith('pos_')) { @@ -41,7 +44,11 @@ export const startMcp = async (app: INestApplication) => { const mastra = await mastraService.mastra(); const agent = mastra.getAgent('postiz'); - const tools = await agent.listTools(); + const tools = { + ...(await agent.listTools()), + // tools that only make sense inside an MCP host (ui:// widgets) + ...(await loadToolsService.loadTools(true)), + }; // The Claude connector directory does not accept AI media generation tools, // so the directory-facing endpoint hides them. Direct connections @@ -57,11 +64,28 @@ export const startMcp = async (app: INestApplication) => { Object.entries(tools).filter(([name]) => !claudeHiddenTools.includes(name)) ) as typeof tools; + const backendUrl = process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL; + + // MCP Apps widgets (ui:// resources). They run in the host's sandboxed iframe, + // which can only reach the domains listed in the csp + const appResources = { + [UPLOAD_WIDGET_URI]: { + name: 'Upload Media', + description: 'Upload an image or video from the device to the media library', + html: uploadWidgetHtml(backendUrl!), + meta: { + csp: { connectDomains: [new URL(backendUrl!).origin] }, + prefersBorder: true, + }, + }, + }; + const serverConfig = { name: 'Postiz MCP', version: '1.0.0', tools, agents: { postiz: agent }, + appResources, }; const server = new MCPServer(serverConfig); @@ -73,16 +97,16 @@ export const startMcp = async (app: INestApplication) => { name: 'Postiz MCP', version: '1.0.0', tools, + appResources, }); const claudeOauthServer = new MCPServer({ name: 'Postiz MCP', version: '1.0.0', tools: claudeTools, + appResources, }); - const backendUrl = process.env.NEXT_PUBLIC_OVERRIDE_BACKEND_URL || process.env.NEXT_PUBLIC_BACKEND_URL; - // Two RFC 8414 path-based issuers backed by the same endpoints and code. // /mcp-oauth-chatgpt is what the ChatGPT app submission points at: it does // not advertise a registration_endpoint, so the OpenAI builder defaults to diff --git a/libraries/nestjs-libraries/src/chat/tools/tool.list.ts b/libraries/nestjs-libraries/src/chat/tools/tool.list.ts index dc5fc98934..c1c5a4bf7d 100644 --- a/libraries/nestjs-libraries/src/chat/tools/tool.list.ts +++ b/libraries/nestjs-libraries/src/chat/tools/tool.list.ts @@ -11,6 +11,9 @@ import { GroupListTool } from '@gitroom/nestjs-libraries/chat/tools/group.list.t import { UploadFromUrlTool } from '@gitroom/nestjs-libraries/chat/tools/upload.from.url.tool'; import { PostsListTool } from '@gitroom/nestjs-libraries/chat/tools/posts.list.tool'; import { PostSettingsTool } from '@gitroom/nestjs-libraries/chat/tools/post.settings.tool'; +import { UploadWidgetTool } from '@gitroom/nestjs-libraries/chat/tools/upload.widget.tool'; +import { UploadWidgetTicketTool } from '@gitroom/nestjs-libraries/chat/tools/upload.widget.ticket.tool'; +import { UploadWidgetStatusTool } from '@gitroom/nestjs-libraries/chat/tools/upload.widget.status.tool'; export const toolList = [ IntegrationListTool, @@ -26,4 +29,7 @@ export const toolList = [ VideoStatusTool, GenerateImageTool, UploadFromUrlTool, + UploadWidgetTool, + UploadWidgetTicketTool, + UploadWidgetStatusTool, ]; diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.widget.status.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.widget.status.tool.ts new file mode 100644 index 0000000000..ce32d12597 --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/tools/upload.widget.status.tool.ts @@ -0,0 +1,72 @@ +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; +import { createTool } from '@mastra/core/tools'; +import { z } from 'zod'; +import { Injectable } from '@nestjs/common'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; + +@Injectable() +export class UploadWidgetStatusTool implements AgentToolInterface { + constructor(private _mediaService: MediaService) {} + name = 'uploadWidgetStatusTool'; + mcpOnly = true; + + run() { + return createTool({ + id: 'uploadWidgetStatusTool', + description: `List the media the user uploaded with the upload widget, using the sessionId returned by uploadWidgetTool. +An empty list means the user did not upload anything yet. A media with the status "processing" is still being prepared: wait about 10 seconds and call again. +A media with the status "ready" can be used as a post attachment with its { id, path }.`, + mcp: { + annotations: { + title: 'Upload Widget Status', + readOnlyHint: true, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, + }, + }, + inputSchema: z.object({ + sessionId: z + .string() + .describe('The sessionId returned by uploadWidgetTool'), + }), + outputSchema: z.object({ + media: z + .array( + z.object({ + id: z.string(), + path: z.string(), + status: z.string(), + error: z.string().optional(), + }) + ) + .optional(), + error: z.string().optional(), + }), + execute: async (inputData, context) => { + checkAuth(inputData, context); + try { + const org = JSON.parse( + (context?.requestContext as any)?.get('organization') as string + ); + const media = await this._mediaService.getUploadSession( + org.id, + inputData.sessionId + ); + return { + media: media.map((p) => ({ + id: p.id, + path: p.path, + status: p.status, + ...(p.processingError ? { error: p.processingError } : {}), + })), + }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { error: `Upload session lookup failed: ${message}` }; + } + }, + }); + } +} diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.widget.ticket.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.widget.ticket.tool.ts new file mode 100644 index 0000000000..f716a2126f --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/tools/upload.widget.ticket.tool.ts @@ -0,0 +1,63 @@ +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; +import { createTool } from '@mastra/core/tools'; +import { z } from 'zod'; +import { Injectable } from '@nestjs/common'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; + +// Meant for the upload widget itself: visibility "app" asks the host to keep it +// away from the model, so the upload credential stays out of the conversation. +// It is a hint only - the ticket is still scoped to the caller's own organization +@Injectable() +export class UploadWidgetTicketTool implements AgentToolInterface { + constructor(private _mediaService: MediaService) {} + name = 'uploadWidgetTicketTool'; + mcpOnly = true; + + run() { + return createTool({ + id: 'uploadWidgetTicketTool', + description: `Used by the upload widget to get a short-lived upload ticket for the sessionId returned by uploadWidgetTool.`, + mcp: { + annotations: { + title: 'Upload Widget Ticket', + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: false, + }, + _meta: { + ui: { + visibility: ['app'], + }, + }, + }, + inputSchema: z.object({ + sessionId: z + .string() + .describe('The sessionId returned by uploadWidgetTool'), + }), + outputSchema: z.object({ + ticket: z.string().optional(), + error: z.string().optional(), + }), + execute: async (inputData, context) => { + checkAuth(inputData, context); + try { + const org = JSON.parse( + (context?.requestContext as any)?.get('organization') as string + ); + return { + ticket: await this._mediaService.createUploadTicket( + org.id, + inputData.sessionId + ), + }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { error: `Failed to create an upload ticket: ${message}` }; + } + }, + }); + } +} diff --git a/libraries/nestjs-libraries/src/chat/tools/upload.widget.tool.ts b/libraries/nestjs-libraries/src/chat/tools/upload.widget.tool.ts new file mode 100644 index 0000000000..826b927ad2 --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/tools/upload.widget.tool.ts @@ -0,0 +1,57 @@ +import { AgentToolInterface } from '@gitroom/nestjs-libraries/chat/agent.tool.interface'; +import { createTool } from '@mastra/core/tools'; +import { z } from 'zod'; +import { Injectable } from '@nestjs/common'; +import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; +import { checkAuth } from '@gitroom/nestjs-libraries/chat/auth.context'; +import { UPLOAD_WIDGET_URI } from '@gitroom/nestjs-libraries/chat/ui/upload.widget'; + +@Injectable() +export class UploadWidgetTool implements AgentToolInterface { + constructor(private _mediaService: MediaService) {} + name = 'uploadWidgetTool'; + mcpOnly = true; + + run() { + return createTool({ + id: 'uploadWidgetTool', + description: `Show the user an upload widget to add images or videos from their own device to the media library. +Use this when the user wants to attach a local file to a post. When the media is already available on a public URL, use uploadFromUrlTool instead. +The widget is only displayed by apps that support MCP Apps (interactive UI); in any other app no widget appears and uploadFromUrlTool with a public URL is the way to add media. +Returns a sessionId: the files the user uploads are reported in the conversation, and can also be read with uploadWidgetStatusTool.`, + mcp: { + annotations: { + title: 'Upload Media From Device', + readOnlyHint: false, + destructiveHint: false, + idempotentHint: false, + openWorldHint: false, + }, + _meta: { + ui: { + resourceUri: UPLOAD_WIDGET_URI, + }, + }, + }, + inputSchema: z.object({}), + outputSchema: z.object({ + sessionId: z.string().optional(), + error: z.string().optional(), + }), + execute: async (inputData, context) => { + checkAuth(inputData, context); + try { + const org = JSON.parse( + (context?.requestContext as any)?.get('organization') as string + ); + return { + sessionId: await this._mediaService.createUploadSession(org.id), + }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { error: `Failed to open the upload widget: ${message}` }; + } + }, + }); + } +} diff --git a/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts b/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts new file mode 100644 index 0000000000..362f984845 --- /dev/null +++ b/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts @@ -0,0 +1,246 @@ +import { getMaxSize } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; + +const megabytes = (mime: string) => Math.floor(getMaxSize(mime) / 1024 / 1024); + +export const UPLOAD_WIDGET_URI = 'ui://postiz/upload'; + +// MCP Apps (SEP-1865) widget: a single self-contained HTML document rendered by +// the host inside a sandboxed iframe. It can't load our bundles or cookies, so +// it talks to the host over postMessage JSON-RPC and to the backend over fetch: +// uploadWidgetTool result (sessionId) -> uploadWidgetTicketTool (ticket, through +// the host) -> POST /media-widget/upload -> report the media back to the model. +// The upload is a plain multipart fetch on purpose: no custom headers and no +// XHR progress listeners, so the browser never sends a CORS preflight +export const uploadWidgetHtml = (backendUrl: string) => ` + + + + + + + + +
    +
    + + +`; diff --git a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts index 11d222c525..bdeaf1f8da 100644 --- a/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/media/media.service.ts @@ -19,6 +19,8 @@ import { organizationId } from '@gitroom/nestjs-libraries/temporal/temporal.sear import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { MediaProcessorJob } from '@gitroom/nestjs-libraries/upload/media.processor.interface'; import { extname } from 'path'; +import { randomBytes } from 'crypto'; +import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; import { ssrfSafeDispatcher } from '@gitroom/nestjs-libraries/dtos/webhooks/ssrf.safe.dispatcher'; import { getMaxSize, @@ -227,6 +229,78 @@ export class MediaService { return this._mediaRepository.getMediaStatus(org, id); } + // Upload widget (MCP Apps): the session id is what the model sees and polls, + // the ticket is the credential the widget uploads with. It is handed to the + // widget only, so it doesn't end up in the conversation + async createUploadSession(org: string) { + const sessionId = randomBytes(16).toString('hex'); + await ioRedis.set(`uploadSession:${sessionId}`, org, 'EX', 3600); + return sessionId; + } + + private async checkUploadSession(org: string, sessionId: string) { + if ((await ioRedis.get(`uploadSession:${sessionId}`)) !== org) { + throw new HttpException('Upload session not found or expired', 404); + } + } + + async createUploadTicket(org: string, sessionId: string) { + await this.checkUploadSession(org, sessionId); + const ticket = randomBytes(32).toString('hex'); + await ioRedis.set( + `uploadTicket:${ticket}`, + JSON.stringify({ org, sessionId }), + 'EX', + 600 + ); + return ticket; + } + + // A ticket never outlives its session: the file is streamed to storage right + // after this check, so an expired session has to be refused here + async getUploadTicket(ticket: string) { + const found = JSON.parse( + (await ioRedis.get(`uploadTicket:${ticket}`)) || 'null' + ) as { org: string; sessionId: string } | null; + if ( + !found || + (await ioRedis.get(`uploadSession:${found.sessionId}`)) !== found.org + ) { + return null; + } + return found; + } + + async saveUploadSessionFile( + org: string, + sessionId: string, + fileName: string, + filePath: string, + originalName?: string + ) { + await this.checkUploadSession(org, sessionId); + const media = await this.saveUploadedFile( + org, + fileName, + filePath, + originalName + ); + // a list, so parallel uploads of the same session can't overwrite each other + await ioRedis.rpush(`uploadSessionMedia:${sessionId}`, media.id); + await ioRedis.expire(`uploadSessionMedia:${sessionId}`, 3600); + return media; + } + + async getUploadSession(org: string, sessionId: string) { + await this.checkUploadSession(org, sessionId); + const list = await ioRedis.lrange(`uploadSessionMedia:${sessionId}`, 0, -1); + return ( + await Promise.all( + list.map((id) => this._mediaRepository.getMediaStatus(org, id)) + ) + ).filter((f) => f); + } + async getMediaStatus(org: string, id: string) { const media = await this._mediaRepository.getMediaStatus(org, id); if (!media) { diff --git a/libraries/nestjs-libraries/src/redis/redis.service.ts b/libraries/nestjs-libraries/src/redis/redis.service.ts index 92a95a6a4c..c54b142de4 100644 --- a/libraries/nestjs-libraries/src/redis/redis.service.ts +++ b/libraries/nestjs-libraries/src/redis/redis.service.ts @@ -18,6 +18,20 @@ class MockRedis { return 1; } + async rpush(key: string, value: any) { + this.data.set(key, [...(this.data.get(key) || []), value]); + return this.data.get(key).length; + } + + async lrange(key: string, start: number, end: number) { + const list = this.data.get(key) || []; + return list.slice(start, end === -1 ? undefined : end + 1); + } + + async expire() { + return 1; + } + // Add other Redis methods as needed for your tests } From c6bfe1355f4843ef732c5fcd845dff9e419c21fc Mon Sep 17 00:00:00 2001 From: Nevo David Date: Fri, 18 Sep 2026 16:17:04 +0700 Subject: [PATCH 56/61] feat: images preview --- .../src/chat/ui/upload.widget.ts | 78 ++++++++++++++----- 1 file changed, 58 insertions(+), 20 deletions(-) diff --git a/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts b/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts index 362f984845..7e3f5eb4f0 100644 --- a/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts +++ b/libraries/nestjs-libraries/src/chat/ui/upload.widget.ts @@ -26,13 +26,20 @@ export const uploadWidgetHtml = (backendUrl: string) => ` #drop.disabled { opacity: 0.5; pointer-events: none; } #drop small { display: block; color: var(--muted); margin-top: 4px; } input[type=file] { display: none; } - ul { list-style: none; padding: 0; margin: 0; } - li { padding: 6px 0; display: flex; gap: 8px; align-items: baseline; } - li:first-child { margin-top: 12px; } - li .name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } - li .state { color: var(--muted); } - li.ok .state { color: var(--ok); } - li.bad .state { color: var(--bad); white-space: normal; } + #files { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 12px; margin-top: 12px; } + #files:empty { display: none; } + .tile { min-width: 0; } + .box { position: relative; aspect-ratio: 1 / 1; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; display: flex; align-items: center; justify-content: center; background: rgba(127, 127, 127, 0.12); color: var(--muted); font-size: 12px; font-weight: 600; } + .box canvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + .tile:not(.ok):not(.bad) canvas { opacity: 0.5; } + .state { position: absolute; left: 0; right: 0; bottom: 0; padding: 3px 4px; font-size: 11px; font-weight: 400; text-align: center; color: #ffffff; background: rgba(0, 0, 0, 0.6); } + .state:empty { display: none; } + .tile.ok .state, .tile.bad .state { left: auto; right: 6px; bottom: 6px; width: 20px; height: 20px; padding: 0; border-radius: 50%; line-height: 20px; background: var(--ok); } + .tile.bad .state { background: var(--bad); } + .tile.bad .box { border-color: var(--bad); } + .name { margin-top: 4px; font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + .note { font-size: 11px; color: var(--bad); } + .note:empty { display: none; } #error { color: var(--bad); margin-top: 12px; } #error:empty { display: none; } @@ -43,7 +50,7 @@ export const uploadWidgetHtml = (backendUrl: string) => ` Images up to ${megabytes('image/png')} MB and videos up to ${megabytes('video/mp4')} MB -
      +