From 3c25e41ce81035252d24e4836005bef638b4037c Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Fri, 5 Dec 2025 09:52:44 -0800 Subject: [PATCH 1/6] chore: bump next version to address CVE --- js/plugins/next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/plugins/next/package.json b/js/plugins/next/package.json index 908f5f7229..88aaea23d4 100644 --- a/js/plugins/next/package.json +++ b/js/plugins/next/package.json @@ -45,7 +45,7 @@ "@types/react-dom": "^19", "genkit": "workspace:*", "jest": "^29.7.0", - "next": "^15.2.4", + "next": "^15.2.6", "npm-run-all": "^4.1.5", "rimraf": "^6.0.1", "ts-jest": "^29.1.2", From 14423194f03bcb199681520715f0309ccc2edd33 Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Fri, 5 Dec 2025 09:52:50 -0800 Subject: [PATCH 2/6] chore: bump next version to address CVE --- js/testapps/next/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/testapps/next/package.json b/js/testapps/next/package.json index feb637679d..d4809938e1 100644 --- a/js/testapps/next/package.json +++ b/js/testapps/next/package.json @@ -19,7 +19,7 @@ "@genkit-ai/google-genai": "workspace:*", "@genkit-ai/next": "workspace:*", "genkit": "workspace:*", - "next": "^15.2.4", + "next": "^15.2.6", "zod": "^3.24.1" }, "devDependencies": { From 0b8800b8a6ae3f9e2e4e61e965e8eeaffb3825b3 Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Mon, 26 Jan 2026 12:32:45 -0800 Subject: [PATCH 3/6] Adds `genkit-js` skill as a starting point for Genkit agent skills. --- js/genkit/.guides/config.json | 39 -- js/genkit/.guides/style.md | 1 - .../.guides/docs/editing-images.prompt | 106 ----- .../.guides/docs/generating-speech.prompt | 192 -------- .../.guides/docs/search-and-urls.prompt | 34 -- js/plugins/google-genai/.guides/usage.md | 19 - js/plugins/next/package.json | 2 +- js/pnpm-lock.yaml | 434 +++++++++++++++--- .../usage.md => skills/genkit-js/SKILL.md | 27 ++ skills/genkit-js/references/gemini.md | 90 ++++ .../genkit-js/references/generating-speech.md | 0 skills/genkit-js/references/nano-banana.md | 0 .../genkit-js/references}/setup.md | 4 +- 13 files changed, 502 insertions(+), 446 deletions(-) delete mode 100644 js/genkit/.guides/config.json delete mode 100644 js/genkit/.guides/style.md delete mode 100644 js/plugins/google-genai/.guides/docs/editing-images.prompt delete mode 100644 js/plugins/google-genai/.guides/docs/generating-speech.prompt delete mode 100644 js/plugins/google-genai/.guides/docs/search-and-urls.prompt delete mode 100644 js/plugins/google-genai/.guides/usage.md rename js/genkit/.guides/usage.md => skills/genkit-js/SKILL.md (66%) create mode 100644 skills/genkit-js/references/gemini.md create mode 100644 skills/genkit-js/references/generating-speech.md create mode 100644 skills/genkit-js/references/nano-banana.md rename {js/genkit/.guides => skills/genkit-js/references}/setup.md (97%) diff --git a/js/genkit/.guides/config.json b/js/genkit/.guides/config.json deleted file mode 100644 index 5e50ed14df..0000000000 --- a/js/genkit/.guides/config.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "mcpServers": { - "genkit": { - "command": "genkit", - "args": ["mcp"] - } - }, - "docs": [ - { - "url": "https://genkit.dev/docs/models.md", - "name": "generate-content", - "title": "Generate Content", - "description": "read before generating content (text, structured data, images, videos) with Genkit." - }, - { - "url": "https://genkit.dev/docs/flows.md", - "name": "flows", - "title": "Using Flows to build GenAI Workflows", - "description": "read before building API endpoints or repeatable, strongly-typed workflows with Genkit" - }, - { - "url": "https://genkit.dev/docs/tool-calling.md", - "name": "tool-calling", - "title": "Tool Calling", - "description": "read before adding tools/function calls to Genkit for GenAI" - }, - { - "url": "https://genkit.dev/docs/interrupts.md", - "name": "tool-calling/interrupts", - "title": "Interrupts (Tool Calling with Human-in-the-Loop)", - "description": "read to understand how to use interrupts to provide human-in-the-loop capabilities to Genkit agents" - }, - { - "url": "https://genkit.dev/docs/context.md", - "name": "context", - "description": "read to understand how to pass context to tools and flows without exposing sensitive data to the LLM" - } - ] -} diff --git a/js/genkit/.guides/style.md b/js/genkit/.guides/style.md deleted file mode 100644 index 170ec60592..0000000000 --- a/js/genkit/.guides/style.md +++ /dev/null @@ -1 +0,0 @@ -- Prefer destructuring generate calls e.g. `const {text} = await ai.generate(...)` diff --git a/js/plugins/google-genai/.guides/docs/editing-images.prompt b/js/plugins/google-genai/.guides/docs/editing-images.prompt deleted file mode 100644 index 8ae25190d8..0000000000 --- a/js/plugins/google-genai/.guides/docs/editing-images.prompt +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Edit images with `gemini-2.5-flash-image-preview` (aka "Nano Banana") -description: read this if you need to perform sophisticated image edits such as background removal, post matching, character replacement, relighting, on an existing image ---- - -The `gemini-2.5-flash-image-preview` model (also known as "Nano Banana") can perform sophisticated image edits. - -- You must ALWAYS add `{config: {responseModalities: ['TEXT', 'IMAGE']}}` to your `ai.generate` calls when using this model. - - -```ts -// generate an image from a prompt - -import { ai } from "@/ai/genkit"; // or wherever genkit is initialized -import { googleAI } from "@genkit-ai/google-genai"; - -const {media} = await ai.generate({ - model: googleAI.model('gemini-2.5-flash-image-preview'), - config: {responseModalities: ['TEXT', 'IMAGE']}}, - prompt: "generate a picture of a unicorn wearing a space suit on the moon", -}); - -return media.url; // --> "data:image/png;base64,..." -``` - - - -```ts -// edit an image with a text prompt - -import { ai } from "@/ai/genkit"; // or wherever genkit is initialized -import { googleAI } from "@genkit-ai/google-genai"; - -const {media} = await ai.generate({ - model: googleAI.model('gemini-2.5-flash-image-preview'), - config: {responseModalities: ['TEXT', 'IMAGE']}}, - prompt: [ - {text: "change the person's outfit to a banana costume"}, - {media: {url: "https://..." /* or 'data:...' */}}, - ], -}); - -return media.url; // --> "data:image/png;base64,..." -``` - - - -```ts -// combine multiple images together - -import { ai } from "@/ai/genkit"; // or wherever genkit is initialized -import { googleAI } from "@genkit-ai/google-genai"; - -const {personImageUri, animalImageUri, sceneryImageUri} = await loadImages(...); - -const {media} = await ai.generate({ - model: googleAI.model('gemini-2.5-flash-image-preview'), - config: {responseModalities: ['TEXT', 'IMAGE']}}, - prompt: [ - // the model tends to match aspect ratio of the *last* image provided - {text: "[PERSON]:\n"}, - {media: {url: personImageUri}}, - {text: "\n[ANIMAL]:\n"}, - {media: {url: animalImageUri}}, - {text; "\n[SCENERY]:\n"}, - // IMPORTANT: the model tends to match aspect ratio of the *last* image provided - {media: {url: sceneryImageUri}}, - {text: "make an image of [PERSON] riding a giant version of [ANIMAL] with a background of [SCENERY]"}, - ], -}); - -return media.url; // --> "data:image/png;base64,..." -``` - - - -```ts -// use an annotated image to guide generation - -import { ai } from "@/ai/genkit"; // or wherever genkit is initialized -import { googleAI } from "@genkit-ai/google-genai"; - -const originalImageUri = "data:..."; // the original image -const annotatedImageUri = "data:..."; // the image with annotations on top of it - -const {media} = await ai.generate({ - model: googleAI.model('gemini-2.5-flash-image-preview'), - config: {responseModalities: ['TEXT', 'IMAGE']}}, - prompt: [ - - {text: "follow the instructions in the following annotated image:"}, - {media: {url: annotatedImageUri}}, - {text: "\n\napply the annotated instructions to the original image, making sure to follow the instructions of the annotations.\n\noriginal image:\n"}, - {media: {url: originalImageUri}}, - ], -}); - -return media.url; // --> "data:image/png;base64,..." -``` - - -## Prompting tips for image editing - -- For complex edits prefer a chain of small edits to a single complex edit. Feed the output of one generation as input to the next. -- Be specific and detailed about the edits you want to make. -- Be clear whether added images are meant as style or subject references. \ No newline at end of file diff --git a/js/plugins/google-genai/.guides/docs/generating-speech.prompt b/js/plugins/google-genai/.guides/docs/generating-speech.prompt deleted file mode 100644 index df4d9410e3..0000000000 --- a/js/plugins/google-genai/.guides/docs/generating-speech.prompt +++ /dev/null @@ -1,192 +0,0 @@ ---- -title: Generating Speech with Gemini -description: read this to understand how to generate realistic speech audio from a text script ---- - -The Google Genai plugin provides access to text-to-speech capabilities through Gemini TTS models. These models can convert text into natural-sounding speech for various applications. - -#### Basic Usage - -To generate audio using a TTS model: - -```ts -import { googleAI } from '@genkit-ai/google-genai'; -import { writeFile } from 'node:fs/promises'; -import wav from 'wav'; // npm install wav && npm install -D @types/wav - -const ai = genkit({ - plugins: [googleAI()], -}); - -const { media } = await ai.generate({ - model: googleAI.model('gemini-2.5-flash-preview-tts'), - config: { - responseModalities: ['AUDIO'], - speechConfig: { - voiceConfig: { - prebuiltVoiceConfig: { voiceName: 'Algenib' }, - }, - }, - }, - prompt: 'Say that Genkit is an amazing Gen AI library', -}); - -if (!media) { - throw new Error('no media returned'); -} -const audioBuffer = Buffer.from(media.url.substring(media.url.indexOf(',') + 1), 'base64'); -// The googleAI plugin returns raw PCM data, which we convert to WAV format. -await writeFile('output.wav', await toWav(audioBuffer)); - -async function toWav(pcmData: Buffer, channels = 1, rate = 24000, sampleWidth = 2): Promise { - return new Promise((resolve, reject) => { - // This code depends on `wav` npm library. - const writer = new wav.Writer({ - channels, - sampleRate: rate, - bitDepth: sampleWidth * 8, - }); - - let bufs = [] as any[]; - writer.on('error', reject); - writer.on('data', function (d) { - bufs.push(d); - }); - writer.on('end', function () { - resolve(Buffer.concat(bufs).toString('base64')); - }); - - writer.write(pcmData); - writer.end(); - }); -} -``` - -#### Multi-speaker Audio Generation - -You can generate audio with multiple speakers, each with their own voice: - -```ts -const response = await ai.generate({ - model: googleAI.model('gemini-2.5-flash-preview-tts'), - config: { - responseModalities: ['AUDIO'], - speechConfig: { - multiSpeakerVoiceConfig: { - speakerVoiceConfigs: [ - { - speaker: 'Speaker1', - voiceConfig: { - prebuiltVoiceConfig: { voiceName: 'Algenib' }, - }, - }, - { - speaker: 'Speaker2', - voiceConfig: { - prebuiltVoiceConfig: { voiceName: 'Achernar' }, - }, - }, - ], - }, - }, - }, - prompt: `Here's the dialog: - Speaker1: "Genkit is an amazing Gen AI library!" - Speaker2: "I thought it was a framework."`, -}); -``` - -When using multi-speaker configuration, the model automatically detects speaker labels in the text (like "Speaker1:" and "Speaker2:") and applies the corresponding voice to each speaker's lines. - -#### Configuration Options - -The Gemini TTS models support various configuration options: - -##### Voice Selection - -You can choose from different pre-built voices with unique characteristics: - -```ts -speechConfig: { - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: 'Algenib' // Other options: 'Achernar', 'Ankaa', etc. - }, - }, -} -``` - -Full list of available voices: - -- `Zephyr`: Bright -- `Puck`: Upbeat -- `Charon`: Informative -- `Kore`: Firm -- `Fenrir`: Excitable -- `Leda`: Youthful -- `Orus`: Firm -- `Aoede`: Breezy -- `Callirrhoe`: Easy-going -- `Autonoe`: Bright -- `Enceladus`: Breathy -- `Iapetus`: Clear -- `Umbriel`: Easy-going -- `Algieba`: Smooth -- `Despina`: Smooth -- `Erinome`: Clear -- `Algenib`: Gravelly -- `Rasalgethi`: Informative -- `Laomedeia`: Upbeat -- `Achernar`: Soft -- `Alnilam`: Firm -- `Schedar`: Even -- `Gacrux`: Mature -- `Pulcherrima`: Forward -- `Achird`: Friendly -- `Zubenelgenubi`: Casual -- `Vindemiatrix`: Gentle -- `Sadachbia`: Lively -- `Sadaltager`: Knowledgeable -- `Sulafat`: Warm - -##### Speech Emphasis - -You can use markdown-style formatting in your prompt to add emphasis: - -- Bold text (`**like this**`) for stronger emphasis -- Italic text (`*like this*`) for moderate emphasis - -Example: - -```ts -prompt: 'Genkit is an **amazing** Gen AI *library*!'; -``` - -##### Advanced Speech Parameters - -For more control over the generated speech: - -```ts -speechConfig: { - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: 'Algenib', - speakingRate: 1.0, // Range: 0.25 to 4.0, default is 1.0 - pitch: 0.0, // Range: -20.0 to 20.0, default is 0.0 - volumeGainDb: 0.0, // Range: -96.0 to 16.0, default is 0.0 - }, - }, -} -``` - -- `speakingRate`: Controls the speed of speech (higher values = faster speech) -- `pitch`: Adjusts the pitch of the voice (higher values = higher pitch) -- `volumeGainDb`: Controls the volume (higher values = louder) - -For more detailed information about the Gemini TTS models and their configuration options, see the [Google AI Speech Generation documentation](https://ai.google.dev/gemini-api/docs/speech-generation). - -## Next Steps - -- Learn about [generating content](/docs/models) to understand how to use these models effectively -- Explore [creating flows](/docs/flows) to build structured AI workflows -- To use the Gemini API at enterprise scale or leverage Vertex vector search and Model Garden, see the [Vertex AI plugin](/docs/integrations/vertex-ai) \ No newline at end of file diff --git a/js/plugins/google-genai/.guides/docs/search-and-urls.prompt b/js/plugins/google-genai/.guides/docs/search-and-urls.prompt deleted file mode 100644 index 1eae75b95b..0000000000 --- a/js/plugins/google-genai/.guides/docs/search-and-urls.prompt +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Search Grounding and URL Context -description: read this to understand how to ground results on Google search or automatically ingest URLs in prompts to understand their contents ---- - -When using Gemini models, you can add configuration to automatically ground the prompt in Google search: - -```ts -const {text} = await ai.generate({ - model: googleAI.model('gemini-2.5-flash'), - // this includes the "built-in" search grounding tool - config: { - tools: [ - {googleSearch: {}}, - ] - } -}) -``` - -If your prompt contains URLs that you want the model to read and understand, you can add the URL context tool: - -```ts -const {text} = await ai.generate({ - model: googleAI.model('gemini-2.5-flash'), - // this includes the "built-in" url fetching tool - config: { - tools: [ - {urlContext: {}}, - ] - } -}) -``` - -You can use either or both of these tools to improve the "groundedness" of your generated model responses. \ No newline at end of file diff --git a/js/plugins/google-genai/.guides/usage.md b/js/plugins/google-genai/.guides/usage.md deleted file mode 100644 index c26f839b26..0000000000 --- a/js/plugins/google-genai/.guides/usage.md +++ /dev/null @@ -1,19 +0,0 @@ -To use a Gemini model with Genkit: - -```ts -import { ai, z } from '...'; // path to genkit instance -import { googleAI } from '@genkit-ai/google-genai'; - -const { text } = await ai.generate({ - model: googleAI.model('gemini-2.5-flash'), - prompt: '...', -}); -``` - -ALWAYS use `gemini-2.5-*` series models, they are the best and current generation of Gemini models. NEVER use `gemini-2.0-*` or `gemini-1.5-*` models. For general purpose inference, use one of these models: - -- `gemini-2.5-flash`: balance of speed/performance, good default -- `gemini-2.5-pro`: most powerful, use for complex prompts -- `gemini-2.5-flash-lite`: very fast, use for simple prompts - -All of these models can accept multi-modal input, but for image or audio output see the available documentation for specialized models. diff --git a/js/plugins/next/package.json b/js/plugins/next/package.json index 88aaea23d4..e3fa4b24d0 100644 --- a/js/plugins/next/package.json +++ b/js/plugins/next/package.json @@ -45,7 +45,7 @@ "@types/react-dom": "^19", "genkit": "workspace:*", "jest": "^29.7.0", - "next": "^15.2.6", + "next": "15.3.6", "npm-run-all": "^4.1.5", "rimraf": "^6.0.1", "ts-jest": "^29.1.2", diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml index 71644552e3..c0e7aa8452 100644 --- a/js/pnpm-lock.yaml +++ b/js/pnpm-lock.yaml @@ -834,8 +834,8 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@4.9.5)) next: - specifier: ^15.2.4 - version: 15.3.3(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 15.3.6 + version: 15.3.6(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -1681,8 +1681,8 @@ importers: specifier: workspace:* version: link:../../genkit next: - specifier: ^15.2.4 - version: 15.3.3(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.2.6 + version: 15.2.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zod: specifier: ^3.24.1 version: 3.25.67 @@ -2747,33 +2747,65 @@ packages: engines: {node: '>=6'} hasBin: true + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-arm64@0.34.2': resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-darwin-x64@0.34.2': resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.1.0': resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.1.0': resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm64@1.1.0': resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + '@img/sharp-libvips-linux-arm@1.1.0': resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] @@ -2784,62 +2816,123 @@ packages: cpu: [ppc64] os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.1.0': resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linux-x64@1.1.0': resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.1.0': resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm64@0.34.2': resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + '@img/sharp-linux-arm@0.34.2': resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-s390x@0.34.2': resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linux-x64@0.34.2': resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.2': resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.34.2': resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + '@img/sharp-wasm32@0.34.2': resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2851,12 +2944,24 @@ packages: cpu: [arm64] os: [win32] + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-ia32@0.34.2': resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@img/sharp-win32-x64@0.34.2': resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3343,53 +3448,104 @@ packages: resolution: {integrity: sha512-92ybDocKl6JM48ZpYbj+A7Qt45IaTABDk0y3sDecEQfgdhfNzJtEityqNHoCZ4Vty2dldPkJhxgvOnbrQMXTTA==} engines: {node: '>= 10'} - '@next/env@15.3.3': - resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} + '@next/env@15.2.6': + resolution: {integrity: sha512-kp1Mpm4K1IzSSJ5ZALfek0JBD2jBw9VGMXR/aT7ykcA2q/ieDARyBzg+e8J1TkeIb5AFj/YjtZdoajdy5uNy6w==} + + '@next/env@15.3.6': + resolution: {integrity: sha512-/cK+QPcfRbDZxmI/uckT4lu9pHCfRIPBLqy88MhE+7Vg5hKrEYc333Ae76dn/cw2FBP2bR/GoK/4DU+U7by/Nw==} - '@next/swc-darwin-arm64@15.3.3': - resolution: {integrity: sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==} + '@next/swc-darwin-arm64@15.2.5': + resolution: {integrity: sha512-4OimvVlFTbgzPdA0kh8A1ih6FN9pQkL4nPXGqemEYgk+e7eQhsst/p35siNNqA49eQA6bvKZ1ASsDtu9gtXuog==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.3': - resolution: {integrity: sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==} + '@next/swc-darwin-arm64@15.3.5': + resolution: {integrity: sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.2.5': + resolution: {integrity: sha512-ohzRaE9YbGt1ctE0um+UGYIDkkOxHV44kEcHzLqQigoRLaiMtZzGrA11AJh2Lu0lv51XeiY1ZkUvkThjkVNBMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.3': - resolution: {integrity: sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==} + '@next/swc-darwin-x64@15.3.5': + resolution: {integrity: sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.2.5': + resolution: {integrity: sha512-FMSdxSUt5bVXqqOoZCc/Seg4LQep9w/fXTazr/EkpXW2Eu4IFI9FD7zBDlID8TJIybmvKk7mhd9s+2XWxz4flA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-gnu@15.3.5': + resolution: {integrity: sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.2.5': + resolution: {integrity: sha512-4ZNKmuEiW5hRKkGp2HWwZ+JrvK4DQLgf8YDaqtZyn7NYdl0cHfatvlnLFSWUayx9yFAUagIgRGRk8pFxS8Qniw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.3': - resolution: {integrity: sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==} + '@next/swc-linux-arm64-musl@15.3.5': + resolution: {integrity: sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.3': - resolution: {integrity: sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==} + '@next/swc-linux-x64-gnu@15.2.5': + resolution: {integrity: sha512-bE6lHQ9GXIf3gCDE53u2pTl99RPZW5V1GLHSRMJ5l/oB/MT+cohu9uwnCK7QUph2xIOu2a6+27kL0REa/kqwZw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.3.5': + resolution: {integrity: sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.3': - resolution: {integrity: sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==} + '@next/swc-linux-x64-musl@15.2.5': + resolution: {integrity: sha512-y7EeQuSkQbTAkCEQnJXm1asRUuGSWAchGJ3c+Qtxh8LVjXleZast8Mn/rL7tZOm7o35QeIpIcid6ufG7EVTTcA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.3': - resolution: {integrity: sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==} + '@next/swc-linux-x64-musl@15.3.5': + resolution: {integrity: sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.2.5': + resolution: {integrity: sha512-gQMz0yA8/dskZM2Xyiq2FRShxSrsJNha40Ob/M2n2+JGRrZ0JwTVjLdvtN6vCxuq4ByhOd4a9qEf60hApNR2gQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.3': - resolution: {integrity: sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==} + '@next/swc-win32-arm64-msvc@15.3.5': + resolution: {integrity: sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.2.5': + resolution: {integrity: sha512-tBDNVUcI7U03+3oMvJ11zrtVin5p0NctiuKmTGyaTIEAVj9Q77xukLXGXRnWxKRIIdFG4OTA2rUVGZDYOwgmAA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.3.5': + resolution: {integrity: sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -6370,11 +6526,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -6389,8 +6540,29 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.3.3: - resolution: {integrity: sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==} + next@15.2.6: + resolution: {integrity: sha512-DIKFctUpZoCq5ok2ztVU+PqhWsbiqM9xNP7rHL2cAp29NQcmDp7Y6JnBBhHRbFt4bCsCZigj6uh+/Gwh2158Wg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + next@15.3.6: + resolution: {integrity: sha512-oI6D1zbbsh6JzzZFDCSHnnx6Qpvd1fSkVJu/5d8uluqnxzuoqtodVZjYvNovooznUq8udSAiKp7MbwlfZ8Gm6w==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -7018,6 +7190,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.2: resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -7091,6 +7267,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -8856,73 +9033,142 @@ snapshots: protobufjs: 7.5.3 yargs: 17.7.2 + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + '@img/sharp-darwin-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.1.0': optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.1.0': optional: true + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + '@img/sharp-libvips-linux-arm@1.1.0': optional: true '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.1.0': optional: true + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + '@img/sharp-libvips-linux-x64@1.1.0': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + '@img/sharp-linux-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + '@img/sharp-linux-arm@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + '@img/sharp-linux-s390x@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + '@img/sharp-linux-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + '@img/sharp-linuxmusl-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.4.3 + optional: true + '@img/sharp-wasm32@0.34.2': dependencies: '@emnapi/runtime': 1.4.3 @@ -8931,9 +9177,15 @@ snapshots: '@img/sharp-win32-arm64@0.34.2': optional: true + '@img/sharp-win32-ia32@0.33.5': + optional: true + '@img/sharp-win32-ia32@0.34.2': optional: true + '@img/sharp-win32-x64@0.33.5': + optional: true + '@img/sharp-win32-x64@0.34.2': optional: true @@ -9329,30 +9581,56 @@ snapshots: '@napi-rs/canvas-win32-x64-msvc': 0.1.71 optional: true - '@next/env@15.3.3': {} + '@next/env@15.2.6': {} + + '@next/env@15.3.6': {} + + '@next/swc-darwin-arm64@15.2.5': + optional: true + + '@next/swc-darwin-arm64@15.3.5': + optional: true + + '@next/swc-darwin-x64@15.2.5': + optional: true + + '@next/swc-darwin-x64@15.3.5': + optional: true + + '@next/swc-linux-arm64-gnu@15.2.5': + optional: true + + '@next/swc-linux-arm64-gnu@15.3.5': + optional: true + + '@next/swc-linux-arm64-musl@15.2.5': + optional: true + + '@next/swc-linux-arm64-musl@15.3.5': + optional: true - '@next/swc-darwin-arm64@15.3.3': + '@next/swc-linux-x64-gnu@15.2.5': optional: true - '@next/swc-darwin-x64@15.3.3': + '@next/swc-linux-x64-gnu@15.3.5': optional: true - '@next/swc-linux-arm64-gnu@15.3.3': + '@next/swc-linux-x64-musl@15.2.5': optional: true - '@next/swc-linux-arm64-musl@15.3.3': + '@next/swc-linux-x64-musl@15.3.5': optional: true - '@next/swc-linux-x64-gnu@15.3.3': + '@next/swc-win32-arm64-msvc@15.2.5': optional: true - '@next/swc-linux-x64-musl@15.3.3': + '@next/swc-win32-arm64-msvc@15.3.5': optional: true - '@next/swc-win32-arm64-msvc@15.3.3': + '@next/swc-win32-x64-msvc@15.2.5': optional: true - '@next/swc-win32-x64-msvc@15.3.3': + '@next/swc-win32-x64-msvc@15.3.5': optional: true '@opentelemetry/api-logs@0.52.1': @@ -13027,10 +13305,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: - optional: true - - nanoid@3.3.8: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -13040,9 +13315,35 @@ snapshots: neo-async@2.6.2: {} - next@15.3.3(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.2.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 15.2.6 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001667 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(@babel/core@7.25.7)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.2.5 + '@next/swc-darwin-x64': 15.2.5 + '@next/swc-linux-arm64-gnu': 15.2.5 + '@next/swc-linux-arm64-musl': 15.2.5 + '@next/swc-linux-x64-gnu': 15.2.5 + '@next/swc-linux-x64-musl': 15.2.5 + '@next/swc-win32-arm64-msvc': 15.2.5 + '@next/swc-win32-x64-msvc': 15.2.5 + '@opentelemetry/api': 1.9.0 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@15.3.6(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 15.3.3 + '@next/env': 15.3.6 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -13052,14 +13353,14 @@ snapshots: react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.6(@babel/core@7.25.7)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.3 - '@next/swc-darwin-x64': 15.3.3 - '@next/swc-linux-arm64-gnu': 15.3.3 - '@next/swc-linux-arm64-musl': 15.3.3 - '@next/swc-linux-x64-gnu': 15.3.3 - '@next/swc-linux-x64-musl': 15.3.3 - '@next/swc-win32-arm64-msvc': 15.3.3 - '@next/swc-win32-x64-msvc': 15.3.3 + '@next/swc-darwin-arm64': 15.3.5 + '@next/swc-darwin-x64': 15.3.5 + '@next/swc-linux-arm64-gnu': 15.3.5 + '@next/swc-linux-arm64-musl': 15.3.5 + '@next/swc-linux-x64-gnu': 15.3.5 + '@next/swc-linux-x64-musl': 15.3.5 + '@next/swc-win32-arm64-msvc': 15.3.5 + '@next/swc-win32-x64-msvc': 15.3.5 '@opentelemetry/api': 1.9.0 sharp: 0.34.2 transitivePeerDependencies: @@ -13371,7 +13672,7 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -13753,6 +14054,33 @@ snapshots: setprototypeof@1.2.0: {} + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + sharp@0.34.2: dependencies: color: 4.2.3 diff --git a/js/genkit/.guides/usage.md b/skills/genkit-js/SKILL.md similarity index 66% rename from js/genkit/.guides/usage.md rename to skills/genkit-js/SKILL.md index 9411df7836..0ba7738814 100644 --- a/js/genkit/.guides/usage.md +++ b/skills/genkit-js/SKILL.md @@ -1,3 +1,17 @@ +--- +name: genkit-js +description: Use the Genkit AI SDK to build application features and agents with LLMs and other GenAI models for JavaScript/TypeScript applications. ALWAYS use this skill when writing Genkit code. +license: Apache-2.0 +metadata: + author: Google +--- + +# Genkit JS + +## Installation + +If Genkit is not already installed and configured in this application (present in `package.json` and `const ai = genkit(...)` present in the codebase), read `references/setup.md` to install and configure Genkit. + ## Basic Example ```ts @@ -61,3 +75,16 @@ import { defineFlow } from "..."; // INCORRECT pre-1.0 syntax - Use `import {z} from "genkit"` when you need Zod to get an implementation consistent with Genkit. - When defining Zod schemas, ONLY use basic scalar, object, and array types. Use `.optional()` when needed and `.describe('...')` to add descriptions for output schemas. - Genkit has many capabilities, make sure to read docs when you need to use them. + +## References + +- [Using Gemini with Genkit](references/gemini.md): Read this to leverage Google's Gemini models with Genkit, including image generation with Nano Banana and Nano Banana Pro models. + +## Online Documentation + +In addition to the above, you can read official documentation directly from the Genkit website by using `https://genkit.dev/docs/{topic}.md` as the URL. Available topics include: + +- `models`: general information about how to generate content +- `flows`: general information about how to define and use flows +- `tool-calling`: general information about how to define and use tools +- `model-context-protocol`: information about how to use and build MCP servers with Genkit diff --git a/skills/genkit-js/references/gemini.md b/skills/genkit-js/references/gemini.md new file mode 100644 index 0000000000..4560d89e31 --- /dev/null +++ b/skills/genkit-js/references/gemini.md @@ -0,0 +1,90 @@ +# Gemini + +## Installation + +To use Gemini models with Genkit, you need to install the Google GenAI plugin: + +```bash +npm i @genkit-ai/google-genai +``` + +and configure it for the Gemini API or Vertex AI API depending on the user's needs: + +```ts +import { googleAI } from '@genkit-ai/google-genai'; // for Gemini API +import { vertexAI } from '@genkit-ai/google-genai'; // for Vertex AI API + +const ai = genkit({ + // ... + plugins: [ + googleAI(), // for Gemini API, GEMINI_API_KEY env variable must be set + vertexAI({ location: 'global' }), // for Vertex AI, Google Application Default Credentials must be available + ], +}); + +googleAI.model('gemini-3-flash-preview'); // specify models for Gemini API +vertexAI.model('gemini-3-pro-preview'); // specify models for Vertex AI API +``` + +## Basic Usage + +```ts +import { ai, z } from '...'; // path to genkit instance +import { googleAI } from '@genkit-ai/google-genai'; + +const { text } = await ai.generate({ + model: googleAI.model('gemini-3-flash-preview'), + prompt: 'Tell me a story in a pirate accent', +}); +``` + +ALWAYS use `gemini-3-*` or`gemini-2.5-*` series models, they are the best and current generation of Gemini models. NEVER use `gemini-2.0-*` or `gemini-1.5-*` models. For general purpose inference, use one of these models: + +- `gemini-3-flash-preview`: balance of speed and performance, good default +- `gemini-3-pro-preview`: most powerful, use for complex prompts +- `gemini-2.5-flash`: GA model with balance of speed/performance +- `gemini-2.5-pro`: GA model for complex prompts +- `gemini-2.5-flash-lite`: GA model for simple prompts + +All of these models can accept multi-modal input, but for image or audio output see the available documentation for specialized models. + +## Common Usage Scenarios + +### Setting Thinking Level (Gemini 3 Models Only) + +```ts +const response = await ai.generate({ + model: googleAI.model('gemini-3-pro-preview'), + prompt: 'what is heavier, one kilo of steel or one kilo of feathers', + config: { + thinkingConfig: { + thinkingLevel: 'HIGH', // Or 'LOW' + includeThoughts: true, // Include thought summaries + }, + }, +}); +``` + +### Google Search Grounding + +When enabled, Gemini models can use Google Search to find current information to answer prompts. + +```ts +const response = await ai.generate({ + model: googleAI.model('gemini-2.5-flash'), + prompt: 'What are the top tech news stories this week?', + config: { + googleSearchRetrieval: true, + }, +}); + +// Access grounding metadata +const groundingMetadata = (response.custom as any)?.candidates?.[0] + ?.groundingMetadata; +if (groundingMetadata) { + console.log('Sources:', groundingMetadata.groundingChunks); +``` + +### Image Generation + +See `references/nano-banana.md` for information about using Nano Banana models for image generation and editing. diff --git a/skills/genkit-js/references/generating-speech.md b/skills/genkit-js/references/generating-speech.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/skills/genkit-js/references/nano-banana.md b/skills/genkit-js/references/nano-banana.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/js/genkit/.guides/setup.md b/skills/genkit-js/references/setup.md similarity index 97% rename from js/genkit/.guides/setup.md rename to skills/genkit-js/references/setup.md index af7e48e4a9..92f0a1ea91 100644 --- a/js/genkit/.guides/setup.md +++ b/skills/genkit-js/references/setup.md @@ -1,3 +1,5 @@ +# Genkit JS Setup + Follow these instructions to set up Genkit in the current codebase. These instructions are general-purpose and have not been written with specific codebase knowledge, so use your best judgement when following them. 0. Tell the user "I'm going to check out your workspace and set you up to use Genkit for GenAI workflows." @@ -13,7 +15,7 @@ import { googleAI } from '@genkit-ai/google-genai'; export const ai = genkit({ plugins: [googleAI()], - model: googleAI.model('gemini-2.5-flash'), + model: googleAI.model('gemini-3-flash-preview'), }); export { z }; From a4d8674e3e81793521f3dcf54736f65920b5d6d8 Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Mon, 26 Jan 2026 12:37:05 -0800 Subject: [PATCH 4/6] updated --- skills/genkit-js/SKILL.md | 4 +- .../genkit-js/references/generating-speech.md | 183 ++++++++++++++++++ skills/genkit-js/references/nano-banana.md | 103 ++++++++++ 3 files changed, 289 insertions(+), 1 deletion(-) diff --git a/skills/genkit-js/SKILL.md b/skills/genkit-js/SKILL.md index 0ba7738814..67515374f3 100644 --- a/skills/genkit-js/SKILL.md +++ b/skills/genkit-js/SKILL.md @@ -78,7 +78,9 @@ import { defineFlow } from "..."; // INCORRECT pre-1.0 syntax ## References -- [Using Gemini with Genkit](references/gemini.md): Read this to leverage Google's Gemini models with Genkit, including image generation with Nano Banana and Nano Banana Pro models. +- [Using Gemini with Genkit](references/gemini.md): Read this to leverage Google's Gemini models with Genkit. +- [Image Generation/Editing with Nano Banana](references/nano-banana.md): Read this to leverage Google's Nano Banana models for image generation and editing. +- [Speech generation with Gemini](references/generating-speech.md): Read this to leverage Google's Gemini TTS models for speech generation. ## Online Documentation diff --git a/skills/genkit-js/references/generating-speech.md b/skills/genkit-js/references/generating-speech.md index e69de29bb2..6dcae1e052 100644 --- a/skills/genkit-js/references/generating-speech.md +++ b/skills/genkit-js/references/generating-speech.md @@ -0,0 +1,183 @@ +# Speech Generation with Gemini TTS + +The Google GenAI plugin provides access to text-to-speech capabilities through Gemini TTS models. These models can convert text into natural-sounding speech for various applications. + +#### Basic Usage + +To generate audio using a TTS model: + +```ts +import { googleAI } from '@genkit-ai/google-genai'; +import { writeFile } from 'node:fs/promises'; +import wav from 'wav'; // npm install wav && npm install -D @types/wav + +const ai = genkit({ + plugins: [googleAI()], +}); + +const { media } = await ai.generate({ + model: googleAI.model('gemini-2.5-flash-preview-tts'), + config: { + responseModalities: ['AUDIO'], + speechConfig: { + voiceConfig: { + prebuiltVoiceConfig: { voiceName: 'Algenib' }, + }, + }, + }, + prompt: 'Say that Genkit is an amazing Gen AI library', +}); + +if (!media) { + throw new Error('no media returned'); +} +const audioBuffer = Buffer.from(media.url.substring(media.url.indexOf(',') + 1), 'base64'); +// The googleAI plugin returns raw PCM data, which we convert to WAV format. +await writeFile('output.wav', await toWav(audioBuffer)); + +async function toWav(pcmData: Buffer, channels = 1, rate = 24000, sampleWidth = 2): Promise { + return new Promise((resolve, reject) => { + // This code depends on `wav` npm library. + const writer = new wav.Writer({ + channels, + sampleRate: rate, + bitDepth: sampleWidth * 8, + }); + + let bufs = [] as any[]; + writer.on('error', reject); + writer.on('data', function (d) { + bufs.push(d); + }); + writer.on('end', function () { + resolve(Buffer.concat(bufs).toString('base64')); + }); + + writer.write(pcmData); + writer.end(); + }); +} +``` + +#### Multi-speaker Audio Generation + +You can generate audio with multiple speakers, each with their own voice: + +```ts +const response = await ai.generate({ + model: googleAI.model('gemini-2.5-flash-preview-tts'), + config: { + responseModalities: ['AUDIO'], + speechConfig: { + multiSpeakerVoiceConfig: { + speakerVoiceConfigs: [ + { + speaker: 'Speaker1', + voiceConfig: { + prebuiltVoiceConfig: { voiceName: 'Algenib' }, + }, + }, + { + speaker: 'Speaker2', + voiceConfig: { + prebuiltVoiceConfig: { voiceName: 'Achernar' }, + }, + }, + ], + }, + }, + }, + prompt: `Here's the dialog: + Speaker1: "Genkit is an amazing Gen AI library!" + Speaker2: "I thought it was a framework."`, +}); +``` + +When using multi-speaker configuration, the model automatically detects speaker labels in the text (like "Speaker1:" and "Speaker2:") and applies the corresponding voice to each speaker's lines. + +#### Configuration Options + +The Gemini TTS models support various configuration options: + +##### Voice Selection + +You can choose from different pre-built voices with unique characteristics: + +```ts +speechConfig: { + voiceConfig: { + prebuiltVoiceConfig: { + voiceName: 'Algenib' // Other options: 'Achernar', 'Ankaa', etc. + }, + }, +} +``` + +Full list of available voices: + +- `Zephyr`: Bright +- `Puck`: Upbeat +- `Charon`: Informative +- `Kore`: Firm +- `Fenrir`: Excitable +- `Leda`: Youthful +- `Orus`: Firm +- `Aoede`: Breezy +- `Callirrhoe`: Easy-going +- `Autonoe`: Bright +- `Enceladus`: Breathy +- `Iapetus`: Clear +- `Umbriel`: Easy-going +- `Algieba`: Smooth +- `Despina`: Smooth +- `Erinome`: Clear +- `Algenib`: Gravelly +- `Rasalgethi`: Informative +- `Laomedeia`: Upbeat +- `Achernar`: Soft +- `Alnilam`: Firm +- `Schedar`: Even +- `Gacrux`: Mature +- `Pulcherrima`: Forward +- `Achird`: Friendly +- `Zubenelgenubi`: Casual +- `Vindemiatrix`: Gentle +- `Sadachbia`: Lively +- `Sadaltager`: Knowledgeable +- `Sulafat`: Warm + +##### Speech Emphasis + +You can use markdown-style formatting in your prompt to add emphasis: + +- Bold text (`**like this**`) for stronger emphasis +- Italic text (`*like this*`) for moderate emphasis + +Example: + +```ts +prompt: 'Genkit is an **amazing** Gen AI *library*!'; +``` + +##### Advanced Speech Parameters + +For more control over the generated speech: + +```ts +speechConfig: { + voiceConfig: { + prebuiltVoiceConfig: { + voiceName: 'Algenib', + speakingRate: 1.0, // Range: 0.25 to 4.0, default is 1.0 + pitch: 0.0, // Range: -20.0 to 20.0, default is 0.0 + volumeGainDb: 0.0, // Range: -96.0 to 16.0, default is 0.0 + }, + }, +} +``` + +- `speakingRate`: Controls the speed of speech (higher values = faster speech) +- `pitch`: Adjusts the pitch of the voice (higher values = higher pitch) +- `volumeGainDb`: Controls the volume (higher values = louder) + +For more detailed information about the Gemini TTS models and their configuration options, see the [Google AI Speech Generation documentation](https://ai.google.dev/gemini-api/docs/speech-generation). diff --git a/skills/genkit-js/references/nano-banana.md b/skills/genkit-js/references/nano-banana.md index e69de29bb2..290bcf4a4b 100644 --- a/skills/genkit-js/references/nano-banana.md +++ b/skills/genkit-js/references/nano-banana.md @@ -0,0 +1,103 @@ +The Nano Banana modles can perform sophisticated image edits. + +- `gemini-2.5-flash-image-preview` + +- You must ALWAYS add `{config: {responseModalities: ['TEXT', 'IMAGE']}}` to your `ai.generate` calls when using this model. + + +```ts +// generate an image from a prompt + +import { ai } from "@/ai/genkit"; // or wherever genkit is initialized +import { googleAI } from "@genkit-ai/google-genai"; + +const {media} = await ai.generate({ + model: googleAI.model('gemini-2.5-flash-image-preview'), + config: {responseModalities: ['TEXT', 'IMAGE']}}, + prompt: "generate a picture of a unicorn wearing a space suit on the moon", +}); + +return media.url; // --> "data:image/png;base64,..." +``` + + + +```ts +// edit an image with a text prompt + +import { ai } from "@/ai/genkit"; // or wherever genkit is initialized +import { googleAI } from "@genkit-ai/google-genai"; + +const {media} = await ai.generate({ + model: googleAI.model('gemini-2.5-flash-image-preview'), + config: {responseModalities: ['TEXT', 'IMAGE']}}, + prompt: [ + {text: "change the person's outfit to a banana costume"}, + {media: {url: "https://..." /* or 'data:...' */}}, + ], +}); + +return media.url; // --> "data:image/png;base64,..." +``` + + + +```ts +// combine multiple images together + +import { ai } from "@/ai/genkit"; // or wherever genkit is initialized +import { googleAI } from "@genkit-ai/google-genai"; + +const {personImageUri, animalImageUri, sceneryImageUri} = await loadImages(...); + +const {media} = await ai.generate({ + model: googleAI.model('gemini-2.5-flash-image-preview'), + config: {responseModalities: ['TEXT', 'IMAGE']}}, + prompt: [ + // the model tends to match aspect ratio of the *last* image provided + {text: "[PERSON]:\n"}, + {media: {url: personImageUri}}, + {text: "\n[ANIMAL]:\n"}, + {media: {url: animalImageUri}}, + {text; "\n[SCENERY]:\n"}, + // IMPORTANT: the model tends to match aspect ratio of the *last* image provided + {media: {url: sceneryImageUri}}, + {text: "make an image of [PERSON] riding a giant version of [ANIMAL] with a background of [SCENERY]"}, + ], +}); + +return media.url; // --> "data:image/png;base64,..." +``` + + + +```ts +// use an annotated image to guide generation + +import { ai } from "@/ai/genkit"; // or wherever genkit is initialized +import { googleAI } from "@genkit-ai/google-genai"; + +const originalImageUri = "data:..."; // the original image +const annotatedImageUri = "data:..."; // the image with annotations on top of it + +const {media} = await ai.generate({ + model: googleAI.model('gemini-2.5-flash-image-preview'), + config: {responseModalities: ['TEXT', 'IMAGE']}}, + prompt: [ + + {text: "follow the instructions in the following annotated image:"}, + {media: {url: annotatedImageUri}}, + {text: "\n\napply the annotated instructions to the original image, making sure to follow the instructions of the annotations.\n\noriginal image:\n"}, + {media: {url: originalImageUri}}, + ], +}); + +return media.url; // --> "data:image/png;base64,..." +``` + + +## Prompting tips for image editing + +- For complex edits prefer a chain of small edits to a single complex edit. Feed the output of one generation as input to the next. +- Be specific and detailed about the edits you want to make. +- Be clear whether added images are meant as style or subject references. \ No newline at end of file From c99af65177bbbba719691cf140889cafe9249ab2 Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Mon, 26 Jan 2026 15:03:57 -0800 Subject: [PATCH 5/6] Update skills/genkit-js/references/nano-banana.md Co-authored-by: Samuel Bushi <66321939+ssbushi@users.noreply.github.com> --- skills/genkit-js/references/nano-banana.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills/genkit-js/references/nano-banana.md b/skills/genkit-js/references/nano-banana.md index 290bcf4a4b..76b525275f 100644 --- a/skills/genkit-js/references/nano-banana.md +++ b/skills/genkit-js/references/nano-banana.md @@ -1,4 +1,4 @@ -The Nano Banana modles can perform sophisticated image edits. +The Nano Banana models can perform sophisticated image edits. - `gemini-2.5-flash-image-preview` From 1743db70da443bf6e5cc058580f2ba617e72b8ab Mon Sep 17 00:00:00 2001 From: Michael Bleigh Date: Mon, 26 Jan 2026 15:11:48 -0800 Subject: [PATCH 6/6] revert changes to unrelated files --- js/plugins/next/package.json | 2 +- js/pnpm-lock.yaml | 434 +++++------------------------------ 2 files changed, 54 insertions(+), 382 deletions(-) diff --git a/js/plugins/next/package.json b/js/plugins/next/package.json index e3fa4b24d0..88aaea23d4 100644 --- a/js/plugins/next/package.json +++ b/js/plugins/next/package.json @@ -45,7 +45,7 @@ "@types/react-dom": "^19", "genkit": "workspace:*", "jest": "^29.7.0", - "next": "15.3.6", + "next": "^15.2.6", "npm-run-all": "^4.1.5", "rimraf": "^6.0.1", "ts-jest": "^29.1.2", diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml index c0e7aa8452..71644552e3 100644 --- a/js/pnpm-lock.yaml +++ b/js/pnpm-lock.yaml @@ -834,8 +834,8 @@ importers: specifier: ^29.7.0 version: 29.7.0(@types/node@20.19.1)(ts-node@10.9.2(@types/node@20.19.1)(typescript@4.9.5)) next: - specifier: 15.3.6 - version: 15.3.6(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.2.4 + version: 15.3.3(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -1681,8 +1681,8 @@ importers: specifier: workspace:* version: link:../../genkit next: - specifier: ^15.2.6 - version: 15.2.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.2.4 + version: 15.3.3(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zod: specifier: ^3.24.1 version: 3.25.67 @@ -2747,65 +2747,33 @@ packages: engines: {node: '>=6'} hasBin: true - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-arm64@0.34.2': resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - '@img/sharp-darwin-x64@0.34.2': resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} - cpu: [arm64] - os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.1.0': resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} - cpu: [x64] - os: [darwin] - '@img/sharp-libvips-darwin-x64@1.1.0': resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linux-arm64@1.1.0': resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} - cpu: [arm] - os: [linux] - '@img/sharp-libvips-linux-arm@1.1.0': resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] @@ -2816,123 +2784,62 @@ packages: cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} - cpu: [s390x] - os: [linux] - '@img/sharp-libvips-linux-s390x@1.1.0': resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linux-x64@1.1.0': resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} - cpu: [arm64] - os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} - cpu: [x64] - os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.1.0': resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linux-arm64@0.34.2': resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - '@img/sharp-linux-arm@0.34.2': resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - '@img/sharp-linux-s390x@0.34.2': resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - '@img/sharp-linux-x64@0.34.2': resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.2': resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - '@img/sharp-linuxmusl-x64@0.34.2': resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - '@img/sharp-wasm32@0.34.2': resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2944,24 +2851,12 @@ packages: cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-ia32@0.34.2': resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@img/sharp-win32-x64@0.34.2': resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3448,104 +3343,53 @@ packages: resolution: {integrity: sha512-92ybDocKl6JM48ZpYbj+A7Qt45IaTABDk0y3sDecEQfgdhfNzJtEityqNHoCZ4Vty2dldPkJhxgvOnbrQMXTTA==} engines: {node: '>= 10'} - '@next/env@15.2.6': - resolution: {integrity: sha512-kp1Mpm4K1IzSSJ5ZALfek0JBD2jBw9VGMXR/aT7ykcA2q/ieDARyBzg+e8J1TkeIb5AFj/YjtZdoajdy5uNy6w==} - - '@next/env@15.3.6': - resolution: {integrity: sha512-/cK+QPcfRbDZxmI/uckT4lu9pHCfRIPBLqy88MhE+7Vg5hKrEYc333Ae76dn/cw2FBP2bR/GoK/4DU+U7by/Nw==} + '@next/env@15.3.3': + resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} - '@next/swc-darwin-arm64@15.2.5': - resolution: {integrity: sha512-4OimvVlFTbgzPdA0kh8A1ih6FN9pQkL4nPXGqemEYgk+e7eQhsst/p35siNNqA49eQA6bvKZ1ASsDtu9gtXuog==} + '@next/swc-darwin-arm64@15.3.3': + resolution: {integrity: sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.3.5': - resolution: {integrity: sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@15.2.5': - resolution: {integrity: sha512-ohzRaE9YbGt1ctE0um+UGYIDkkOxHV44kEcHzLqQigoRLaiMtZzGrA11AJh2Lu0lv51XeiY1ZkUvkThjkVNBMA==} + '@next/swc-darwin-x64@15.3.3': + resolution: {integrity: sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.3.5': - resolution: {integrity: sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@15.2.5': - resolution: {integrity: sha512-FMSdxSUt5bVXqqOoZCc/Seg4LQep9w/fXTazr/EkpXW2Eu4IFI9FD7zBDlID8TJIybmvKk7mhd9s+2XWxz4flA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-gnu@15.3.5': - resolution: {integrity: sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@15.2.5': - resolution: {integrity: sha512-4ZNKmuEiW5hRKkGp2HWwZ+JrvK4DQLgf8YDaqtZyn7NYdl0cHfatvlnLFSWUayx9yFAUagIgRGRk8pFxS8Qniw==} + '@next/swc-linux-arm64-gnu@15.3.3': + resolution: {integrity: sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.5': - resolution: {integrity: sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==} + '@next/swc-linux-arm64-musl@15.3.3': + resolution: {integrity: sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.2.5': - resolution: {integrity: sha512-bE6lHQ9GXIf3gCDE53u2pTl99RPZW5V1GLHSRMJ5l/oB/MT+cohu9uwnCK7QUph2xIOu2a6+27kL0REa/kqwZw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.3.5': - resolution: {integrity: sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==} + '@next/swc-linux-x64-gnu@15.3.3': + resolution: {integrity: sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.2.5': - resolution: {integrity: sha512-y7EeQuSkQbTAkCEQnJXm1asRUuGSWAchGJ3c+Qtxh8LVjXleZast8Mn/rL7tZOm7o35QeIpIcid6ufG7EVTTcA==} + '@next/swc-linux-x64-musl@15.3.3': + resolution: {integrity: sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.5': - resolution: {integrity: sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@15.2.5': - resolution: {integrity: sha512-gQMz0yA8/dskZM2Xyiq2FRShxSrsJNha40Ob/M2n2+JGRrZ0JwTVjLdvtN6vCxuq4ByhOd4a9qEf60hApNR2gQ==} + '@next/swc-win32-arm64-msvc@15.3.3': + resolution: {integrity: sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.3.5': - resolution: {integrity: sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.2.5': - resolution: {integrity: sha512-tBDNVUcI7U03+3oMvJ11zrtVin5p0NctiuKmTGyaTIEAVj9Q77xukLXGXRnWxKRIIdFG4OTA2rUVGZDYOwgmAA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.3.5': - resolution: {integrity: sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==} + '@next/swc-win32-x64-msvc@15.3.3': + resolution: {integrity: sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -6526,6 +6370,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -6540,29 +6389,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next@15.2.6: - resolution: {integrity: sha512-DIKFctUpZoCq5ok2ztVU+PqhWsbiqM9xNP7rHL2cAp29NQcmDp7Y6JnBBhHRbFt4bCsCZigj6uh+/Gwh2158Wg==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - - next@15.3.6: - resolution: {integrity: sha512-oI6D1zbbsh6JzzZFDCSHnnx6Qpvd1fSkVJu/5d8uluqnxzuoqtodVZjYvNovooznUq8udSAiKp7MbwlfZ8Gm6w==} + next@15.3.3: + resolution: {integrity: sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -7190,10 +7018,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.34.2: resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -7267,7 +7091,6 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -9033,142 +8856,73 @@ snapshots: protobufjs: 7.5.3 yargs: 17.7.2 - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 - optional: true - '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 - optional: true - '@img/sharp-darwin-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.1.0 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': - optional: true - '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': - optional: true - '@img/sharp-libvips-darwin-x64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': - optional: true - '@img/sharp-libvips-linux-arm64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': - optional: true - '@img/sharp-libvips-linux-arm@1.1.0': optional: true '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': - optional: true - '@img/sharp-libvips-linux-s390x@1.1.0': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': - optional: true - '@img/sharp-libvips-linux-x64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - optional: true - '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 - optional: true - '@img/sharp-linux-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 - optional: true - '@img/sharp-linux-arm@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 - optional: true - '@img/sharp-linux-s390x@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 - optional: true - '@img/sharp-linux-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - optional: true - '@img/sharp-linuxmusl-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - optional: true - '@img/sharp-linuxmusl-x64@0.34.2': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-wasm32@0.33.5': - dependencies: - '@emnapi/runtime': 1.4.3 - optional: true - '@img/sharp-wasm32@0.34.2': dependencies: '@emnapi/runtime': 1.4.3 @@ -9177,15 +8931,9 @@ snapshots: '@img/sharp-win32-arm64@0.34.2': optional: true - '@img/sharp-win32-ia32@0.33.5': - optional: true - '@img/sharp-win32-ia32@0.34.2': optional: true - '@img/sharp-win32-x64@0.33.5': - optional: true - '@img/sharp-win32-x64@0.34.2': optional: true @@ -9581,56 +9329,30 @@ snapshots: '@napi-rs/canvas-win32-x64-msvc': 0.1.71 optional: true - '@next/env@15.2.6': {} - - '@next/env@15.3.6': {} - - '@next/swc-darwin-arm64@15.2.5': - optional: true - - '@next/swc-darwin-arm64@15.3.5': - optional: true - - '@next/swc-darwin-x64@15.2.5': - optional: true - - '@next/swc-darwin-x64@15.3.5': - optional: true - - '@next/swc-linux-arm64-gnu@15.2.5': - optional: true - - '@next/swc-linux-arm64-gnu@15.3.5': - optional: true - - '@next/swc-linux-arm64-musl@15.2.5': - optional: true - - '@next/swc-linux-arm64-musl@15.3.5': - optional: true + '@next/env@15.3.3': {} - '@next/swc-linux-x64-gnu@15.2.5': + '@next/swc-darwin-arm64@15.3.3': optional: true - '@next/swc-linux-x64-gnu@15.3.5': + '@next/swc-darwin-x64@15.3.3': optional: true - '@next/swc-linux-x64-musl@15.2.5': + '@next/swc-linux-arm64-gnu@15.3.3': optional: true - '@next/swc-linux-x64-musl@15.3.5': + '@next/swc-linux-arm64-musl@15.3.3': optional: true - '@next/swc-win32-arm64-msvc@15.2.5': + '@next/swc-linux-x64-gnu@15.3.3': optional: true - '@next/swc-win32-arm64-msvc@15.3.5': + '@next/swc-linux-x64-musl@15.3.3': optional: true - '@next/swc-win32-x64-msvc@15.2.5': + '@next/swc-win32-arm64-msvc@15.3.3': optional: true - '@next/swc-win32-x64-msvc@15.3.5': + '@next/swc-win32-x64-msvc@15.3.3': optional: true '@opentelemetry/api-logs@0.52.1': @@ -13305,7 +13027,10 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: {} + nanoid@3.3.11: + optional: true + + nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -13315,35 +13040,9 @@ snapshots: neo-async@2.6.2: {} - next@15.2.6(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 15.2.6 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001667 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.6(@babel/core@7.25.7)(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 15.2.5 - '@next/swc-darwin-x64': 15.2.5 - '@next/swc-linux-arm64-gnu': 15.2.5 - '@next/swc-linux-arm64-musl': 15.2.5 - '@next/swc-linux-x64-gnu': 15.2.5 - '@next/swc-linux-x64-musl': 15.2.5 - '@next/swc-win32-arm64-msvc': 15.2.5 - '@next/swc-win32-x64-msvc': 15.2.5 - '@opentelemetry/api': 1.9.0 - sharp: 0.33.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.3.6(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.3.3(@babel/core@7.25.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 15.3.6 + '@next/env': 15.3.3 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -13353,14 +13052,14 @@ snapshots: react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.6(@babel/core@7.25.7)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.5 - '@next/swc-darwin-x64': 15.3.5 - '@next/swc-linux-arm64-gnu': 15.3.5 - '@next/swc-linux-arm64-musl': 15.3.5 - '@next/swc-linux-x64-gnu': 15.3.5 - '@next/swc-linux-x64-musl': 15.3.5 - '@next/swc-win32-arm64-msvc': 15.3.5 - '@next/swc-win32-x64-msvc': 15.3.5 + '@next/swc-darwin-arm64': 15.3.3 + '@next/swc-darwin-x64': 15.3.3 + '@next/swc-linux-arm64-gnu': 15.3.3 + '@next/swc-linux-arm64-musl': 15.3.3 + '@next/swc-linux-x64-gnu': 15.3.3 + '@next/swc-linux-x64-musl': 15.3.3 + '@next/swc-win32-arm64-msvc': 15.3.3 + '@next/swc-win32-x64-msvc': 15.3.3 '@opentelemetry/api': 1.9.0 sharp: 0.34.2 transitivePeerDependencies: @@ -13672,7 +13371,7 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -14054,33 +13753,6 @@ snapshots: setprototypeof@1.2.0: {} - sharp@0.33.5: - dependencies: - color: 4.2.3 - detect-libc: 2.0.4 - semver: 7.7.2 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 - optional: true - sharp@0.34.2: dependencies: color: 4.2.3