diff --git a/integrations/community/cloudflare-agents/typescript/.gitignore b/integrations/community/cloudflare-agents/typescript/.gitignore new file mode 100644 index 000000000..18b60c368 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/.gitignore @@ -0,0 +1,12 @@ +node_modules +dist +.turbo +.wrangler +*.log +# Secrets - never commit these! +.env* +.dev.vars* +# But keep example files +!.env.example +!.dev.vars.example +reference diff --git a/integrations/community/cloudflare-agents/typescript/.npmignore b/integrations/community/cloudflare-agents/typescript/.npmignore new file mode 100644 index 000000000..047da5f46 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/.npmignore @@ -0,0 +1,16 @@ +src +tsconfig.json +tsup.config.ts +jest.config.js +tests +.turbo +.wrangler +*.log + +# Secrets - never include in npm package +.env* +.dev.vars* + +# Keep example files +!.env.example +!.dev.vars.example diff --git a/integrations/community/cloudflare-agents/typescript/README.md b/integrations/community/cloudflare-agents/typescript/README.md new file mode 100644 index 000000000..51d8f7c78 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/README.md @@ -0,0 +1,337 @@ +# @ag-ui/cloudflare-agents + +AG-UI integration for Cloudflare Agents - Connect to and build agents on Cloudflare Workers. + +## What This Package Provides + +### 🔌 Client (Connect to Agents) + +**CloudflareAgentsClient** - WebSocket client for connecting to deployed Cloudflare Agents from AG-UI applications. + +```typescript +import { CloudflareAgentsClient } from "@ag-ui/cloudflare-agents"; + +const agent = new CloudflareAgentsClient({ + url: "wss://your-worker.workers.dev", +}); + +agent + .runAgent({ + messages: [{ role: "user", content: "Hello!" }], + }) + .subscribe({ + next: (event) => console.log(event.type, event), + }); +``` + +### 🔄 Adapter (Build Agents) + +**AgentsToAGUIAdapter** - Convert Vercel AI SDK streams to AG-UI events in your Cloudflare Workers. + +```typescript +import { AgentsToAGUIAdapter } from "@ag-ui/cloudflare-agents"; +import { streamText } from "ai"; +import { openai } from "@ai-sdk/openai"; + +const adapter = new AgentsToAGUIAdapter(); + +const stream = streamText({ + model: openai("gpt-4"), + messages: inputMessages, +}); + +for await (const event of adapter.adaptStreamToAGUI( + stream, + threadId, + runId, + inputMessages +)) { + ws.send(JSON.stringify(event)); // Send AG-UI events to client +} +``` + +### 🌊 Helpers (Streaming) + +**Response creators** - SSE and NDJSON streaming utilities for HTTP endpoints. + +```typescript +import { createSSEResponse, createNDJSONResponse } from "@ag-ui/cloudflare-agents"; +import { from } from "rxjs"; + +// SSE streaming +const events$ = from(adapter.adaptStreamToAGUI(stream, ...)); +return createSSEResponse(events$); + +// NDJSON streaming +return createNDJSONResponse(events$); +``` + +## Installation + +```bash +npm install @ag-ui/cloudflare-agents +# or +pnpm add @ag-ui/cloudflare-agents +``` + +## Quick Start + +### Client-Side: Connect to an Agent + +```typescript +import { CloudflareAgentsClient } from "@ag-ui/cloudflare-agents"; + +const agent = new CloudflareAgentsClient({ + url: "wss://your-agent.workers.dev", +}); + +agent + .runAgent({ + messages: [{ role: "user", content: "What's the weather?" }], + threadId: "thread-123", + }) + .subscribe({ + next: (event) => { + if (event.type === "TEXT_MESSAGE_CHUNK") { + console.log(event.delta); // Stream text chunks + } + if (event.type === "STATE_SNAPSHOT") { + console.log(event.state); // State updates + } + }, + complete: () => console.log("Done"), + }); +``` + +### Server-Side: Build an Agent + +Create a Cloudflare Worker that uses the adapter to emit AG-UI events: + +```typescript +import { Agent } from "agents"; +import { streamText } from "ai"; +import { openai } from "@ai-sdk/openai"; +import { AgentsToAGUIAdapter } from "@ag-ui/cloudflare-agents"; + +export class MyAgent extends Agent { + private adapter = new AgentsToAGUIAdapter(); + + async onMessage(ws: WebSocket, raw: string | ArrayBuffer) { + const data = typeof raw === "string" ? raw : new TextDecoder().decode(raw); + const { messages } = JSON.parse(data); + + // Create AI SDK stream + const stream = streamText({ + model: openai("gpt-4"), + messages: messages.map((m) => ({ + role: m.role, + content: m.content, + })), + }); + + // Convert to AG-UI events and stream to client + for await (const event of this.adapter.adaptStreamToAGUI( + stream, + crypto.randomUUID(), // threadId + crypto.randomUUID(), // runId + messages + )) { + ws.send(JSON.stringify(event)); + } + } +} +``` + +### With Tools + +```typescript +import { z } from "zod"; + +const stream = streamText({ + model: openai("gpt-4"), + messages, + tools: { + getWeather: { + description: "Get current weather", + parameters: z.object({ + location: z.string() + }), + execute: async ({ location }) => { + return { temperature: 72, condition: "sunny" }; + } + } + } +}); + +for await (const event of adapter.adaptStreamToAGUI(stream, ...)) { + ws.send(JSON.stringify(event)); +} +``` + +### With Initial State + +```typescript +for await (const event of adapter.adaptStreamToAGUI( + stream, + threadId, + runId, + messages, + undefined, // parentRunId + { count: 0, user: "alice" } // initial state +)) { + ws.send(JSON.stringify(event)); +} +``` + +## Features + +- WebSocket client for connecting to deployed agents +- Adapter for converting Vercel AI SDK streams to AG-UI events +- SSE and NDJSON streaming support +- Automatic tool call event conversion +- State snapshots and deltas +- Message history snapshots +- TypeScript support + +## Architecture + +``` +┌─────────────────────────┐ +│ AG-UI Application │ +│ (Your Frontend) │ +└───────────┬─────────────┘ + │ WebSocket + ↓ +┌─────────────────────────┐ +│ CloudflareAgentsClient │ +│ (This Package) │ +└───────────┬─────────────┘ + │ WebSocket + ↓ +┌─────────────────────────┐ +│ Cloudflare Worker │ +│ + AgentsToAGUIAdapter │ +│ (Your Deployed Agent) │ +└───────────┬─────────────┘ + │ Vercel AI SDK + ↓ +┌─────────────────────────┐ +│ LLM Provider │ +│ (OpenAI, Anthropic...) │ +└─────────────────────────┘ +``` + +## Event Flow + +The adapter automatically handles AG-UI event patterns: + +### Lifecycle Pattern + +``` +RUN_STARTED → [events...] → RUN_FINISHED + ↘ RUN_ERROR +``` + +### Text Streaming Pattern + +``` +TEXT_MESSAGE_CHUNK (auto-expands to) + ↓ +TEXT_MESSAGE_START + ↓ +TEXT_MESSAGE_CONTENT × N + ↓ +TEXT_MESSAGE_END +``` + +### Tool Call Pattern + +``` +TOOL_CALL_CHUNK (auto-expands to) + ↓ +TOOL_CALL_START + ↓ +TOOL_CALL_ARGS × N + ↓ +TOOL_CALL_END + ↓ +TOOL_CALL_RESULT +``` + +### State Management Pattern + +``` +STATE_SNAPSHOT (complete state) +STATE_DELTA (incremental update via JSON Patch) +``` + +## Documentation + +- **[docs/README.md](./docs/README.md)** - Quick start and overview +- **[docs/CLIENT.md](./docs/CLIENT.md)** - Client usage and architecture +- **[docs/ADAPTER.md](./docs/ADAPTER.md)** - Adapter patterns and examples + +## API Reference + +### CloudflareAgentsClient + +```typescript +class CloudflareAgentsClient extends AbstractAgent { + constructor(config: { url: string; ... }); + run(input: RunAgentInput): Observable; + abortRun(): void; + clone(): CloudflareAgentsClient; +} +``` + +### AgentsToAGUIAdapter + +```typescript +class AgentsToAGUIAdapter { + async *adaptStreamToAGUI( + stream: StreamTextResult, + threadId?: string, + runId?: string, + inputMessages?: Message[], + parentRunId?: string, + state?: any + ): AsyncGenerator; +} +``` + +### Response Helpers + +```typescript +function createSSEResponse( + events$: Observable, + additionalHeaders?: Record +): Response; + +function createNDJSONResponse( + events$: Observable, + additionalHeaders?: Record +): Response; +``` + +## Requirements + +- Node.js 18+ or modern browser +- Cloudflare Workers (for deployment) +- AG-UI framework + +## Deployment + +Deploy your Cloudflare Worker agent: + +```bash +# Install Wrangler CLI +npm install -g wrangler + +# Set API keys as secrets +wrangler secret put OPENAI_API_KEY + +# Deploy +wrangler deploy +``` + +Your agent will be available at: `https://your-worker.workers.dev` diff --git a/integrations/community/cloudflare-agents/typescript/dist/index.js b/integrations/community/cloudflare-agents/typescript/dist/index.js new file mode 100644 index 000000000..4ca0bc282 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/dist/index.js @@ -0,0 +1,138 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/index.ts +var index_exports = {}; +__export(index_exports, { + CloudflareAgentsAgent: () => CloudflareAgentsAgent +}); +module.exports = __toCommonJS(index_exports); +var import_client = require("@ag-ui/client"); +var import_core = require("@ag-ui/core"); +var import_rxjs = require("rxjs"); +var CloudflareAgentsAgent = class extends import_client.AbstractAgent { + constructor(config) { + super(config); + this.ws = null; + this.abortController = new AbortController(); + this.url = config.url; + } + runAgent(parameters, subscriber) { + var _a; + this.abortController = (_a = parameters == null ? void 0 : parameters.abortController) != null ? _a : new AbortController(); + return super.runAgent(parameters, subscriber); + } + abortRun() { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + this.abortController.abort(); + super.abortRun(); + } + run(input) { + return new import_rxjs.Observable((observer) => { + const wsUrl = this.url.replace(/^http/, "ws"); + this.ws = new WebSocket(wsUrl); + this.ws.onopen = () => { + var _a, _b; + const message = (_a = input.messages) == null ? void 0 : _a[0]; + if (message && "content" in message && typeof message.content === "string") { + (_b = this.ws) == null ? void 0 : _b.send(message.content); + } + }; + this.ws.onmessage = (event) => { + try { + const cloudflareEvent = JSON.parse(event.data); + const agEvent = this.transformEvent(cloudflareEvent); + if (agEvent) { + observer.next(agEvent); + } + } catch (err) { + observer.error(err); + } + }; + this.ws.onerror = (error) => { + observer.error(error); + }; + this.ws.onclose = () => { + observer.complete(); + }; + return () => { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + }; + }); + } + transformEvent(cloudflareEvent) { + switch (cloudflareEvent.type) { + case "RUN_STARTED": + return { + type: import_core.EventType.RUN_STARTED, + run_id: cloudflareEvent.run_id, + thread_id: cloudflareEvent.thread_id + }; + case "TEXT_MESSAGE_START": + return { + type: import_core.EventType.TEXT_MESSAGE_START, + run_id: cloudflareEvent.run_id, + role: cloudflareEvent.role + }; + case "TEXT_MESSAGE_CONTENT": + return { + type: import_core.EventType.TEXT_MESSAGE_CONTENT, + run_id: cloudflareEvent.run_id, + delta: cloudflareEvent.delta + }; + case "TEXT_MESSAGE_END": + return { + type: import_core.EventType.TEXT_MESSAGE_END, + run_id: cloudflareEvent.run_id + }; + case "RUN_FINISHED": + return { + type: import_core.EventType.RUN_FINISHED, + run_id: cloudflareEvent.run_id + }; + case "READY": + return null; + default: + console.warn("Unknown Cloudflare Agent event type:", cloudflareEvent.type); + return null; + } + } + clone() { + const cloned = super.clone(); + cloned.url = this.url; + const newController = new AbortController(); + const originalSignal = this.abortController.signal; + if (originalSignal.aborted) { + newController.abort(originalSignal.reason); + } + cloned.abortController = newController; + return cloned; + } +}; +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + CloudflareAgentsAgent +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/integrations/community/cloudflare-agents/typescript/dist/index.js.map b/integrations/community/cloudflare-agents/typescript/dist/index.js.map new file mode 100644 index 000000000..44eeceb6d --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { AbstractAgent, RunAgentResult } from \"@ag-ui/client\";\nimport { AgentConfig, RunAgentParameters } from \"@ag-ui/client\";\nimport { RunAgentInput, BaseEvent, EventType } from \"@ag-ui/core\";\nimport { Observable } from \"rxjs\";\nimport { AgentSubscriber } from \"@ag-ui/client\";\n\ninterface CloudflareAgentsConfig extends AgentConfig {\n url: string;\n}\n\ninterface RunCloudflareAgentConfig extends RunAgentParameters {\n abortController?: AbortController;\n}\n\n/**\n * Cloudflare Agents AG-UI connector\n * Connects to a Cloudflare Worker running the Agents SDK via WebSocket\n */\nexport class CloudflareAgentsAgent extends AbstractAgent {\n public url: string;\n private ws: WebSocket | null = null;\n public abortController: AbortController = new AbortController();\n\n constructor(config: CloudflareAgentsConfig) {\n super(config);\n this.url = config.url;\n }\n\n public runAgent(\n parameters?: RunCloudflareAgentConfig,\n subscriber?: AgentSubscriber,\n ): Promise {\n this.abortController = parameters?.abortController ?? new AbortController();\n return super.runAgent(parameters, subscriber);\n }\n\n abortRun() {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.abortController.abort();\n super.abortRun();\n }\n\n run(input: RunAgentInput): Observable {\n return new Observable((observer) => {\n const wsUrl = this.url.replace(/^http/, \"ws\");\n this.ws = new WebSocket(wsUrl);\n\n this.ws.onopen = () => {\n // Send the AG-UI input to the Cloudflare Agent\n const message = input.messages?.[0];\n if (message && \"content\" in message && typeof message.content === \"string\") {\n this.ws?.send(message.content);\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n const cloudflareEvent = JSON.parse(event.data);\n\n // Transform Cloudflare Agent events to AG-UI events\n const agEvent = this.transformEvent(cloudflareEvent);\n if (agEvent) {\n observer.next(agEvent);\n }\n } catch (err) {\n observer.error(err);\n }\n };\n\n this.ws.onerror = (error) => {\n observer.error(error);\n };\n\n this.ws.onclose = () => {\n observer.complete();\n };\n\n return () => {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n };\n });\n }\n\n private transformEvent(cloudflareEvent: any): BaseEvent | null {\n // Map Cloudflare Agent events to AG-UI events\n switch (cloudflareEvent.type) {\n case \"RUN_STARTED\":\n return {\n type: EventType.RUN_STARTED,\n run_id: cloudflareEvent.run_id,\n thread_id: cloudflareEvent.thread_id,\n };\n\n case \"TEXT_MESSAGE_START\":\n return {\n type: EventType.TEXT_MESSAGE_START,\n run_id: cloudflareEvent.run_id,\n role: cloudflareEvent.role,\n };\n\n case \"TEXT_MESSAGE_CONTENT\":\n return {\n type: EventType.TEXT_MESSAGE_CONTENT,\n run_id: cloudflareEvent.run_id,\n delta: cloudflareEvent.delta,\n };\n\n case \"TEXT_MESSAGE_END\":\n return {\n type: EventType.TEXT_MESSAGE_END,\n run_id: cloudflareEvent.run_id,\n };\n\n case \"RUN_FINISHED\":\n return {\n type: EventType.RUN_FINISHED,\n run_id: cloudflareEvent.run_id,\n };\n\n case \"READY\":\n // Ignore handshake events\n return null;\n\n default:\n console.warn(\"Unknown Cloudflare Agent event type:\", cloudflareEvent.type);\n return null;\n }\n }\n\n public clone(): CloudflareAgentsAgent {\n const cloned = super.clone() as CloudflareAgentsAgent;\n cloned.url = this.url;\n\n const newController = new AbortController();\n const originalSignal = this.abortController.signal as AbortSignal & { reason?: unknown };\n if (originalSignal.aborted) {\n newController.abort(originalSignal.reason);\n }\n cloned.abortController = newController;\n\n return cloned;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA8C;AAE9C,kBAAoD;AACpD,kBAA2B;AAepB,IAAM,wBAAN,cAAoC,4BAAc;AAAA,EAKvD,YAAY,QAAgC;AAC1C,UAAM,MAAM;AAJd,SAAQ,KAAuB;AAC/B,SAAO,kBAAmC,IAAI,gBAAgB;AAI5D,SAAK,MAAM,OAAO;AAAA,EACpB;AAAA,EAEO,SACL,YACA,YACyB;AA/B7B;AAgCI,SAAK,mBAAkB,8CAAY,oBAAZ,YAA+B,IAAI,gBAAgB;AAC1E,WAAO,MAAM,SAAS,YAAY,UAAU;AAAA,EAC9C;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,gBAAgB,MAAM;AAC3B,UAAM,SAAS;AAAA,EACjB;AAAA,EAEA,IAAI,OAA6C;AAC/C,WAAO,IAAI,uBAAsB,CAAC,aAAa;AAC7C,YAAM,QAAQ,KAAK,IAAI,QAAQ,SAAS,IAAI;AAC5C,WAAK,KAAK,IAAI,UAAU,KAAK;AAE7B,WAAK,GAAG,SAAS,MAAM;AAlD7B;AAoDQ,cAAM,WAAU,WAAM,aAAN,mBAAiB;AACjC,YAAI,WAAW,aAAa,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC1E,qBAAK,OAAL,mBAAS,KAAK,QAAQ;AAAA,QACxB;AAAA,MACF;AAEA,WAAK,GAAG,YAAY,CAAC,UAAU;AAC7B,YAAI;AACF,gBAAM,kBAAkB,KAAK,MAAM,MAAM,IAAI;AAG7C,gBAAM,UAAU,KAAK,eAAe,eAAe;AACnD,cAAI,SAAS;AACX,qBAAS,KAAK,OAAO;AAAA,UACvB;AAAA,QACF,SAAS,KAAK;AACZ,mBAAS,MAAM,GAAG;AAAA,QACpB;AAAA,MACF;AAEA,WAAK,GAAG,UAAU,CAAC,UAAU;AAC3B,iBAAS,MAAM,KAAK;AAAA,MACtB;AAEA,WAAK,GAAG,UAAU,MAAM;AACtB,iBAAS,SAAS;AAAA,MACpB;AAEA,aAAO,MAAM;AACX,YAAI,KAAK,IAAI;AACX,eAAK,GAAG,MAAM;AACd,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,iBAAwC;AAE7D,YAAQ,gBAAgB,MAAM;AAAA,MAC5B,KAAK;AACH,eAAO;AAAA,UACL,MAAM,sBAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,UACxB,WAAW,gBAAgB;AAAA,QAC7B;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,sBAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,UACxB,MAAM,gBAAgB;AAAA,QACxB;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,sBAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,UACxB,OAAO,gBAAgB;AAAA,QACzB;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,sBAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,QAC1B;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,sBAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,QAC1B;AAAA,MAEF,KAAK;AAEH,eAAO;AAAA,MAET;AACE,gBAAQ,KAAK,wCAAwC,gBAAgB,IAAI;AACzE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEO,QAA+B;AACpC,UAAM,SAAS,MAAM,MAAM;AAC3B,WAAO,MAAM,KAAK;AAElB,UAAM,gBAAgB,IAAI,gBAAgB;AAC1C,UAAM,iBAAiB,KAAK,gBAAgB;AAC5C,QAAI,eAAe,SAAS;AAC1B,oBAAc,MAAM,eAAe,MAAM;AAAA,IAC3C;AACA,WAAO,kBAAkB;AAEzB,WAAO;AAAA,EACT;AACF;","names":[]} \ No newline at end of file diff --git a/integrations/community/cloudflare-agents/typescript/dist/index.mjs b/integrations/community/cloudflare-agents/typescript/dist/index.mjs new file mode 100644 index 000000000..786b4453f --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/dist/index.mjs @@ -0,0 +1,113 @@ +// src/index.ts +import { AbstractAgent } from "@ag-ui/client"; +import { EventType } from "@ag-ui/core"; +import { Observable } from "rxjs"; +var CloudflareAgentsAgent = class extends AbstractAgent { + constructor(config) { + super(config); + this.ws = null; + this.abortController = new AbortController(); + this.url = config.url; + } + runAgent(parameters, subscriber) { + var _a; + this.abortController = (_a = parameters == null ? void 0 : parameters.abortController) != null ? _a : new AbortController(); + return super.runAgent(parameters, subscriber); + } + abortRun() { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + this.abortController.abort(); + super.abortRun(); + } + run(input) { + return new Observable((observer) => { + const wsUrl = this.url.replace(/^http/, "ws"); + this.ws = new WebSocket(wsUrl); + this.ws.onopen = () => { + var _a, _b; + const message = (_a = input.messages) == null ? void 0 : _a[0]; + if (message && "content" in message && typeof message.content === "string") { + (_b = this.ws) == null ? void 0 : _b.send(message.content); + } + }; + this.ws.onmessage = (event) => { + try { + const cloudflareEvent = JSON.parse(event.data); + const agEvent = this.transformEvent(cloudflareEvent); + if (agEvent) { + observer.next(agEvent); + } + } catch (err) { + observer.error(err); + } + }; + this.ws.onerror = (error) => { + observer.error(error); + }; + this.ws.onclose = () => { + observer.complete(); + }; + return () => { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + }; + }); + } + transformEvent(cloudflareEvent) { + switch (cloudflareEvent.type) { + case "RUN_STARTED": + return { + type: EventType.RUN_STARTED, + run_id: cloudflareEvent.run_id, + thread_id: cloudflareEvent.thread_id + }; + case "TEXT_MESSAGE_START": + return { + type: EventType.TEXT_MESSAGE_START, + run_id: cloudflareEvent.run_id, + role: cloudflareEvent.role + }; + case "TEXT_MESSAGE_CONTENT": + return { + type: EventType.TEXT_MESSAGE_CONTENT, + run_id: cloudflareEvent.run_id, + delta: cloudflareEvent.delta + }; + case "TEXT_MESSAGE_END": + return { + type: EventType.TEXT_MESSAGE_END, + run_id: cloudflareEvent.run_id + }; + case "RUN_FINISHED": + return { + type: EventType.RUN_FINISHED, + run_id: cloudflareEvent.run_id + }; + case "READY": + return null; + default: + console.warn("Unknown Cloudflare Agent event type:", cloudflareEvent.type); + return null; + } + } + clone() { + const cloned = super.clone(); + cloned.url = this.url; + const newController = new AbortController(); + const originalSignal = this.abortController.signal; + if (originalSignal.aborted) { + newController.abort(originalSignal.reason); + } + cloned.abortController = newController; + return cloned; + } +}; +export { + CloudflareAgentsAgent +}; +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/integrations/community/cloudflare-agents/typescript/dist/index.mjs.map b/integrations/community/cloudflare-agents/typescript/dist/index.mjs.map new file mode 100644 index 000000000..281e262f8 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/dist/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { AbstractAgent, RunAgentResult } from \"@ag-ui/client\";\nimport { AgentConfig, RunAgentParameters } from \"@ag-ui/client\";\nimport { RunAgentInput, BaseEvent, EventType } from \"@ag-ui/core\";\nimport { Observable } from \"rxjs\";\nimport { AgentSubscriber } from \"@ag-ui/client\";\n\ninterface CloudflareAgentsConfig extends AgentConfig {\n url: string;\n}\n\ninterface RunCloudflareAgentConfig extends RunAgentParameters {\n abortController?: AbortController;\n}\n\n/**\n * Cloudflare Agents AG-UI connector\n * Connects to a Cloudflare Worker running the Agents SDK via WebSocket\n */\nexport class CloudflareAgentsAgent extends AbstractAgent {\n public url: string;\n private ws: WebSocket | null = null;\n public abortController: AbortController = new AbortController();\n\n constructor(config: CloudflareAgentsConfig) {\n super(config);\n this.url = config.url;\n }\n\n public runAgent(\n parameters?: RunCloudflareAgentConfig,\n subscriber?: AgentSubscriber,\n ): Promise {\n this.abortController = parameters?.abortController ?? new AbortController();\n return super.runAgent(parameters, subscriber);\n }\n\n abortRun() {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.abortController.abort();\n super.abortRun();\n }\n\n run(input: RunAgentInput): Observable {\n return new Observable((observer) => {\n const wsUrl = this.url.replace(/^http/, \"ws\");\n this.ws = new WebSocket(wsUrl);\n\n this.ws.onopen = () => {\n // Send the AG-UI input to the Cloudflare Agent\n const message = input.messages?.[0];\n if (message && \"content\" in message && typeof message.content === \"string\") {\n this.ws?.send(message.content);\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n const cloudflareEvent = JSON.parse(event.data);\n\n // Transform Cloudflare Agent events to AG-UI events\n const agEvent = this.transformEvent(cloudflareEvent);\n if (agEvent) {\n observer.next(agEvent);\n }\n } catch (err) {\n observer.error(err);\n }\n };\n\n this.ws.onerror = (error) => {\n observer.error(error);\n };\n\n this.ws.onclose = () => {\n observer.complete();\n };\n\n return () => {\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n };\n });\n }\n\n private transformEvent(cloudflareEvent: any): BaseEvent | null {\n // Map Cloudflare Agent events to AG-UI events\n switch (cloudflareEvent.type) {\n case \"RUN_STARTED\":\n return {\n type: EventType.RUN_STARTED,\n run_id: cloudflareEvent.run_id,\n thread_id: cloudflareEvent.thread_id,\n };\n\n case \"TEXT_MESSAGE_START\":\n return {\n type: EventType.TEXT_MESSAGE_START,\n run_id: cloudflareEvent.run_id,\n role: cloudflareEvent.role,\n };\n\n case \"TEXT_MESSAGE_CONTENT\":\n return {\n type: EventType.TEXT_MESSAGE_CONTENT,\n run_id: cloudflareEvent.run_id,\n delta: cloudflareEvent.delta,\n };\n\n case \"TEXT_MESSAGE_END\":\n return {\n type: EventType.TEXT_MESSAGE_END,\n run_id: cloudflareEvent.run_id,\n };\n\n case \"RUN_FINISHED\":\n return {\n type: EventType.RUN_FINISHED,\n run_id: cloudflareEvent.run_id,\n };\n\n case \"READY\":\n // Ignore handshake events\n return null;\n\n default:\n console.warn(\"Unknown Cloudflare Agent event type:\", cloudflareEvent.type);\n return null;\n }\n }\n\n public clone(): CloudflareAgentsAgent {\n const cloned = super.clone() as CloudflareAgentsAgent;\n cloned.url = this.url;\n\n const newController = new AbortController();\n const originalSignal = this.abortController.signal as AbortSignal & { reason?: unknown };\n if (originalSignal.aborted) {\n newController.abort(originalSignal.reason);\n }\n cloned.abortController = newController;\n\n return cloned;\n }\n}\n"],"mappings":";AAAA,SAAS,qBAAqC;AAE9C,SAAmC,iBAAiB;AACpD,SAAS,kBAAkB;AAepB,IAAM,wBAAN,cAAoC,cAAc;AAAA,EAKvD,YAAY,QAAgC;AAC1C,UAAM,MAAM;AAJd,SAAQ,KAAuB;AAC/B,SAAO,kBAAmC,IAAI,gBAAgB;AAI5D,SAAK,MAAM,OAAO;AAAA,EACpB;AAAA,EAEO,SACL,YACA,YACyB;AA/B7B;AAgCI,SAAK,mBAAkB,8CAAY,oBAAZ,YAA+B,IAAI,gBAAgB;AAC1E,WAAO,MAAM,SAAS,YAAY,UAAU;AAAA,EAC9C;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,gBAAgB,MAAM;AAC3B,UAAM,SAAS;AAAA,EACjB;AAAA,EAEA,IAAI,OAA6C;AAC/C,WAAO,IAAI,WAAsB,CAAC,aAAa;AAC7C,YAAM,QAAQ,KAAK,IAAI,QAAQ,SAAS,IAAI;AAC5C,WAAK,KAAK,IAAI,UAAU,KAAK;AAE7B,WAAK,GAAG,SAAS,MAAM;AAlD7B;AAoDQ,cAAM,WAAU,WAAM,aAAN,mBAAiB;AACjC,YAAI,WAAW,aAAa,WAAW,OAAO,QAAQ,YAAY,UAAU;AAC1E,qBAAK,OAAL,mBAAS,KAAK,QAAQ;AAAA,QACxB;AAAA,MACF;AAEA,WAAK,GAAG,YAAY,CAAC,UAAU;AAC7B,YAAI;AACF,gBAAM,kBAAkB,KAAK,MAAM,MAAM,IAAI;AAG7C,gBAAM,UAAU,KAAK,eAAe,eAAe;AACnD,cAAI,SAAS;AACX,qBAAS,KAAK,OAAO;AAAA,UACvB;AAAA,QACF,SAAS,KAAK;AACZ,mBAAS,MAAM,GAAG;AAAA,QACpB;AAAA,MACF;AAEA,WAAK,GAAG,UAAU,CAAC,UAAU;AAC3B,iBAAS,MAAM,KAAK;AAAA,MACtB;AAEA,WAAK,GAAG,UAAU,MAAM;AACtB,iBAAS,SAAS;AAAA,MACpB;AAEA,aAAO,MAAM;AACX,YAAI,KAAK,IAAI;AACX,eAAK,GAAG,MAAM;AACd,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,iBAAwC;AAE7D,YAAQ,gBAAgB,MAAM;AAAA,MAC5B,KAAK;AACH,eAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,UACxB,WAAW,gBAAgB;AAAA,QAC7B;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,UACxB,MAAM,gBAAgB;AAAA,QACxB;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,UACxB,OAAO,gBAAgB;AAAA,QACzB;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,QAC1B;AAAA,MAEF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,UAAU;AAAA,UAChB,QAAQ,gBAAgB;AAAA,QAC1B;AAAA,MAEF,KAAK;AAEH,eAAO;AAAA,MAET;AACE,gBAAQ,KAAK,wCAAwC,gBAAgB,IAAI;AACzE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEO,QAA+B;AACpC,UAAM,SAAS,MAAM,MAAM;AAC3B,WAAO,MAAM,KAAK;AAElB,UAAM,gBAAgB,IAAI,gBAAgB;AAC1C,UAAM,iBAAiB,KAAK,gBAAgB;AAC5C,QAAI,eAAe,SAAS;AAC1B,oBAAc,MAAM,eAAe,MAAM;AAAA,IAC3C;AACA,WAAO,kBAAkB;AAEzB,WAAO;AAAA,EACT;AACF;","names":[]} \ No newline at end of file diff --git a/integrations/community/cloudflare-agents/typescript/docs/ADAPTER.md b/integrations/community/cloudflare-agents/typescript/docs/ADAPTER.md new file mode 100644 index 000000000..726b36ce7 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/docs/ADAPTER.md @@ -0,0 +1,508 @@ +# AgentsToAGUIAdapter + +Adapter for converting Vercel AI SDK streaming responses to AG-UI protocol events. + +## Overview + +`AgentsToAGUIAdapter` bridges the Vercel AI SDK and AG-UI protocol, enabling Cloudflare Agents to emit AG-UI events. It handles: + +- Text message streaming with automatic chunking +- Tool call execution and results +- State management (snapshots and deltas) +- Message history snapshots +- Activity tracking +- Custom and raw events + +## Basic Usage + +```typescript +import { AgentsToAGUIAdapter } from "@ag-ui/cloudflare-agents"; +import { streamText } from "ai"; +import { openai } from "@ai-sdk/openai"; + +const adapter = new AgentsToAGUIAdapter(); + +const stream = streamText({ + model: openai("gpt-4"), + messages: inputMessages, +}); + +for await (const event of adapter.adaptStreamToAGUI( + stream, + "thread-123", + "run-456", + inputMessages +)) { + // Send AG-UI event to client + ws.send(JSON.stringify(event)); +} +``` + +## Event Patterns + +The adapter implements all AG-UI event patterns: + +### 1. Lifecycle Pattern + +``` +RUN_STARTED + ↓ +[events...] + ↓ +RUN_FINISHED / RUN_ERROR +``` + +### 2. Start-Content-End Pattern (Text Streaming) + +AG-UI automatically expands `TEXT_MESSAGE_CHUNK` events: + +```typescript +// First chunk (includes messageId and role) +{ + type: "TEXT_MESSAGE_CHUNK", + messageId: "msg-123", + role: "assistant", + delta: "Hello", + timestamp: 1234567890 +} + +// Subsequent chunks (only delta) +{ + type: "TEXT_MESSAGE_CHUNK", + delta: " world", + timestamp: 1234567891 +} +``` + +AG-UI expands to: +``` +TEXT_MESSAGE_START (messageId, role) + ↓ +TEXT_MESSAGE_CONTENT (delta) × N + ↓ +TEXT_MESSAGE_END +``` + +### 3. Tool Call Pattern + +```typescript +// Tool call chunk (automatically expands) +{ + type: "TOOL_CALL_CHUNK", + toolCallId: "call-123", + toolCallName: "search", + parentMessageId: "msg-123", + delta: '{"query":"weather"}', + timestamp: 1234567890 +} +``` + +AG-UI expands to: +``` +TOOL_CALL_START (toolCallId, toolCallName) + ↓ +TOOL_CALL_ARGS (delta) × N + ↓ +TOOL_CALL_END +``` + +### 4. State Management Pattern + +**STATE_SNAPSHOT** - Complete state replacement: +```typescript +{ + type: "STATE_SNAPSHOT", + snapshot: { count: 1, user: "alice" }, + timestamp: 1234567890 +} +``` + +**STATE_DELTA** - Incremental updates (JSON Patch): +```typescript +{ + type: "STATE_DELTA", + patch: [ + { op: "replace", path: "/count", value: 2 } + ], + timestamp: 1234567890 +} +``` + +Use STATE_SNAPSHOT for: +- Initial state +- Complete resets +- Infrequent, large updates + +Use STATE_DELTA for: +- Frequent updates +- Minimal data transfer +- Incremental changes + +### 5. Messages Snapshot Pattern + +Provides complete conversation history: + +```typescript +{ + type: "MESSAGES_SNAPSHOT", + messages: [ + { id: "msg-1", role: "user", content: "Hello" }, + { id: "msg-2", role: "assistant", content: "Hi there!" } + ], + timestamp: 1234567890 +} +``` + +Useful for: +- Initializing chat history +- Post-interruption sync +- Conversation context refresh + +### 6. Activity Events Pattern + +Activity events expose structured, in-progress updates between messages: + +**ACTIVITY_SNAPSHOT** - Complete activity state: +```typescript +{ + type: "ACTIVITY_SNAPSHOT", + messageId: "msg-123", + activityType: "PLAN", + content: { + title: "Execution Plan", + steps: ["Step 1", "Step 2", "Step 3"], + currentStep: 0 + }, + replace: true, // Replace existing plan activity + timestamp: 1234567890 +} +``` + +**ACTIVITY_DELTA** - Incremental updates: +```typescript +{ + type: "ACTIVITY_DELTA", + messageId: "msg-123", + activityType: "PLAN", + patch: [ + { op: "replace", path: "/currentStep", value: 1 } + ], + timestamp: 1234567890 +} +``` + +Common activity types: +- `PLAN` - Execution plans +- `SEARCH` - Search operations +- `REASONING` - Reasoning steps +- `ANALYSIS` - Data analysis +- Custom types for your application + +### 7. Custom Events Pattern + +Extension mechanism for application-specific events: + +```typescript +// Progress event +{ + type: "CUSTOM", + name: "progress", + value: { current: 5, total: 10, percentage: 50 }, + timestamp: 1234567890 +} + +// Notification event +{ + type: "CUSTOM", + name: "notification", + value: { level: "info", message: "Processing complete" }, + timestamp: 1234567890 +} +``` + +CUSTOM events are part of the protocol (unlike RAW events). + +### 8. Raw Events Pattern + +Container for external system events: + +```typescript +// External system event +{ + type: "RAW", + event: { + type: "EXTERNAL_UPDATE", + payload: { status: "processing", id: "ext-123" } + }, + source: "external-api", + timestamp: 1234567890 +} + +// Legacy system event +{ + type: "RAW", + event: { + eventType: "LEGACY_NOTIFICATION", + data: { message: "Process complete" } + }, + source: "legacy-system", + timestamp: 1234567890 +} +``` + +Use for wrapping third-party events, legacy systems, or external APIs. + +## Complete Example + +```typescript +import { AgentsToAGUIAdapter } from "@ag-ui/cloudflare-agents"; +import { streamText } from "ai"; +import { openai } from "@ai-sdk/openai"; + +export async function handleAgentRequest( + ws: WebSocket, + inputMessages: Message[] +) { + const adapter = new AgentsToAGUIAdapter(); + + // Create AI SDK stream + const stream = streamText({ + model: openai("gpt-4"), + messages: inputMessages, + tools: { + search: { + description: "Search for information", + parameters: z.object({ + query: z.string(), + }), + execute: async ({ query }) => { + return await performSearch(query); + }, + }, + }, + }); + + // Convert to AG-UI events and send to client + try { + for await (const event of adapter.adaptStreamToAGUI( + stream, + "thread-123", + "run-456", + inputMessages, + undefined, // parentRunId + { count: 0 } // initial state + )) { + ws.send(JSON.stringify(event)); + } + } catch (error) { + ws.send(JSON.stringify({ + type: "RUN_ERROR", + message: error.message, + code: "ADAPTER_ERROR", + timestamp: Date.now() + })); + } +} +``` + +## Event Sequence + +A typical event sequence from the adapter: + +``` +1. RUN_STARTED (with input) +2. STATE_SNAPSHOT (if initial state provided) +3. STEP_STARTED ("Generating Response") +4. TEXT_MESSAGE_CHUNK × N (streaming text) +5. STEP_FINISHED ("Generating Response") +6. STEP_STARTED ("Executing Tools") [if tools used] +7. TOOL_CALL_CHUNK × N (for each tool) +8. STEP_FINISHED ("Executing Tools") +9. TOOL_CALL_RESULT × N (tool results) +10. MESSAGES_SNAPSHOT (complete conversation) +11. RUN_FINISHED (with result) +``` + +## Advanced Patterns + +### With Parent Run ID (Branching) + +```typescript +for await (const event of adapter.adaptStreamToAGUI( + stream, + threadId, + runId, + inputMessages, + parentRunId // Enable branching/time travel +)) { + ws.send(JSON.stringify(event)); +} +``` + +### With Initial State + +```typescript +for await (const event of adapter.adaptStreamToAGUI( + stream, + threadId, + runId, + inputMessages, + undefined, + { user: "alice", preferences: {...} } +)) { + ws.send(JSON.stringify(event)); +} +``` + +### Emitting Custom Events + +The adapter handles standard AI SDK events. To emit custom events, manually yield them: + +```typescript +async function* customAdapter(stream, ...args) { + const adapter = new AgentsToAGUIAdapter(); + + for await (const event of adapter.adaptStreamToAGUI(stream, ...args)) { + yield event; + + // Emit custom progress event + if (event.type === "STEP_STARTED") { + yield { + type: "CUSTOM", + name: "progress", + value: { step: event.stepName }, + timestamp: Date.now() + }; + } + } +} +``` + +### Emitting Activity Events + +```typescript +async function* activityAdapter(stream, ...args) { + const adapter = new AgentsToAGUIAdapter(); + + for await (const event of adapter.adaptStreamToAGUI(stream, ...args)) { + yield event; + + // Emit plan activity + if (event.type === "STEP_STARTED" && event.stepName === "Planning") { + yield { + type: "ACTIVITY_SNAPSHOT", + messageId: "msg-123", + activityType: "PLAN", + content: { + title: "Execution Plan", + steps: ["Analyze", "Execute", "Verify"] + }, + replace: true, + timestamp: Date.now() + }; + } + } +} +``` + +## Error Handling + +The adapter catches errors and emits RUN_ERROR: + +```typescript +try { + for await (const event of adapter.adaptStreamToAGUI(...)) { + ws.send(JSON.stringify(event)); + } +} catch (error) { + // Adapter already emits RUN_ERROR + // Additional handling if needed +} +``` + +RUN_ERROR event structure: +```typescript +{ + type: "RUN_ERROR", + message: "Error description", + code: "STREAM_ERROR", + timestamp: 1234567890 +} +``` + +## Integration with Cloudflare Workers + +```typescript +import { routeAgentRequest } from "agents"; +import { AgentsToAGUIAdapter } from "@ag-ui/cloudflare-agents"; + +export default { + async fetch(req: Request, env: Env) { + // Let Agents SDK handle WebSocket upgrade + const agentResponse = routeAgentRequest(req, env); + if (agentResponse) return agentResponse; + + // Handle other routes + return new Response("Not found", { status: 404 }); + } +}; + +// In your agent class +class MyAgent extends Agent { + async onMessage(ws: WebSocket, message: string) { + const { messages } = JSON.parse(message); + const adapter = new AgentsToAGUIAdapter(); + + const stream = streamText({ + model: openai("gpt-4"), + messages + }); + + for await (const event of adapter.adaptStreamToAGUI( + stream, + crypto.randomUUID(), + crypto.randomUUID(), + messages + )) { + ws.send(JSON.stringify(event)); + } + } +} +``` + +## API Reference + +### `adaptStreamToAGUI()` + +```typescript +async *adaptStreamToAGUI( + stream: StreamTextResult, + threadId?: string, + runId?: string, + inputMessages?: Message[], + parentRunId?: string, + state?: any +): AsyncGenerator +``` + +**Parameters:** +- `stream` - Vercel AI SDK StreamTextResult +- `threadId` - Thread ID (default: random UUID) +- `runId` - Run ID (default: random UUID) +- `inputMessages` - Input messages for snapshot (default: []) +- `parentRunId` - Parent run ID for branching (optional) +- `state` - Initial agent state (optional) + +**Returns:** AsyncGenerator yielding AG-UI BaseEvent objects + +**Yields:** +- `RUN_STARTED` - Always first +- `STATE_SNAPSHOT` - If state provided +- `STEP_STARTED` - For each step +- `TEXT_MESSAGE_CHUNK` - For streaming text +- `STEP_FINISHED` - After each step +- `TOOL_CALL_CHUNK` - For tool calls +- `TOOL_CALL_RESULT` - For tool results +- `MESSAGES_SNAPSHOT` - Before RUN_FINISHED +- `RUN_FINISHED` - Always last (success) +- `RUN_ERROR` - On error (instead of RUN_FINISHED) diff --git a/integrations/community/cloudflare-agents/typescript/docs/CLIENT.md b/integrations/community/cloudflare-agents/typescript/docs/CLIENT.md new file mode 100644 index 000000000..b1200948e --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/docs/CLIENT.md @@ -0,0 +1,346 @@ +# CloudflareAgentsClient + +WebSocket-based client for connecting to deployed Cloudflare Agents from AG-UI applications. + +## Overview + +`CloudflareAgentsClient` extends `AbstractAgent` and provides a WebSocket connection to Cloudflare Workers running the Cloudflare Agents SDK. It handles: + +- WebSocket connection management (connect, reconnect, disconnect) +- Event transformation (Cloudflare → AG-UI protocol) +- Message ID tracking across streaming chunks +- State synchronization from server `this.setState()` calls +- Error handling and resilient message parsing + +## Basic Usage + +```typescript +import { CloudflareAgentsClient } from "@ag-ui/cloudflare-agents"; + +const agent = new CloudflareAgentsClient({ + url: "wss://your-worker.workers.dev" +}); + +const subscription = agent.runAgent({ + messages: [{ role: "user", content: "Hello!" }], + threadId: "thread-123", + runId: "run-456" +}).subscribe({ + next: (event) => { + console.log(event.type, event); + }, + error: (err) => { + console.error("Error:", err); + }, + complete: () => { + console.log("Stream completed"); + } +}); + +// Later, to abort: +agent.abortRun(); +// or +subscription.unsubscribe(); +``` + +## Event Flow + +``` +Client → WebSocket → Cloudflare Worker + ↓ +RUN_STARTED + ↓ +TEXT_MESSAGE_CHUNK (streaming) + ↓ +STATE_SNAPSHOT (if server calls setState) + ↓ +RUN_FINISHED +``` + +## Event Transformation + +The client automatically transforms Cloudflare SDK events to AG-UI events: + +| Cloudflare Event | AG-UI Event | Description | +|-----------------|-------------|-------------| +| `TEXT_CHUNK` | `TEXT_MESSAGE_CHUNK` | Streaming text from LLM | +| `cf_agent_state` | `STATE_SNAPSHOT` | State updates from `this.setState()` | +| `READY`, `PONG` | *(ignored)* | Connection lifecycle events | + +### TEXT_CHUNK → TEXT_MESSAGE_CHUNK + +When the server sends text chunks: + +```json +{ "type": "TEXT_CHUNK", "text": "Hello", "messageId": "msg-1" } +``` + +The client transforms it to: + +```json +{ + "type": "TEXT_MESSAGE_CHUNK", + "messageId": "msg-1", + "role": "assistant", + "delta": "Hello", + "timestamp": 1234567890 +} +``` + +AG-UI automatically expands this to: +1. `TEXT_MESSAGE_START` (first chunk only) +2. `TEXT_MESSAGE_CONTENT` (each chunk) +3. `TEXT_MESSAGE_END` (when messageId changes or stream ends) + +### cf_agent_state → STATE_SNAPSHOT + +When the server calls `this.setState()`, Cloudflare Agents SDK automatically broadcasts: + +```json +{ + "type": "cf_agent_state", + "state": { "count": 1, "user": "alice" } +} +``` + +The client transforms it to: + +```json +{ + "type": "STATE_SNAPSHOT", + "state": { "count": 1, "user": "alice" }, + "timestamp": 1234567890 +} +``` + +## Message ID Tracking + +The client intelligently tracks message IDs across chunks: + +1. **Server provides ID**: Uses it (allows server to control message boundaries) +2. **No current ID**: Generates new UUID (first chunk of new message) +3. **Has current ID**: Reuses it (continuation of current message) + +This ensures all chunks belonging to the same message share the same `messageId`, which AG-UI requires for proper grouping. + +## WebSocket Connection + +### Browser Environment + +Uses native `WebSocket` API: + +```typescript +const agent = new CloudflareAgentsClient({ + url: "wss://your-worker.workers.dev" +}); +``` + +### Node.js Environment + +Requires the `ws` package: + +```bash +npm install ws +``` + +```typescript +import WebSocket from "ws"; +globalThis.WebSocket = WebSocket; + +const agent = new CloudflareAgentsClient({ + url: "wss://your-worker.workers.dev" +}); +``` + +## Error Handling + +### Parse Errors + +If a message fails to parse, the client: +1. Logs the error for debugging +2. Emits `RUN_ERROR` event with code `"PARSE_ERROR"` +3. Continues processing subsequent messages (doesn't crash the stream) + +```typescript +agent.runAgent({ messages }).subscribe({ + next: (event) => { + if (event.type === "RUN_ERROR" && event.code === "PARSE_ERROR") { + console.warn("Malformed message from server"); + } + } +}); +``` + +### WebSocket Errors + +Fatal connection errors (network issues, server unavailable): + +```typescript +agent.runAgent({ messages }).subscribe({ + error: (err) => { + // WebSocket connection failed + console.error("Connection error:", err); + } +}); +``` + +## Advanced Usage + +### State Tracking + +Listen for state updates from the server: + +```typescript +agent.runAgent({ messages }).subscribe({ + next: (event) => { + if (event.type === "STATE_SNAPSHOT") { + console.log("Server state:", event.state); + // Update your UI with new state + } + } +}); +``` + +### Cloning Agents + +Create a new instance with the same configuration: + +```typescript +const agent1 = new CloudflareAgentsClient({ url: "wss://..." }); +const agent2 = agent1.clone(); // Same config, fresh state + +// Both can run independently +agent1.runAgent({ messages: [...] }); +agent2.runAgent({ messages: [...] }); +``` + +### Aborting Runs + +```typescript +const agent = new CloudflareAgentsClient({ url: "wss://..." }); + +// Start a run +const subscription = agent.runAgent({ messages }).subscribe(...); + +// Abort via agent +agent.abortRun(); // Closes WebSocket, emits RUN_FINISHED, completes observable + +// OR abort via subscription +subscription.unsubscribe(); // Same effect +``` + +## Connection Lifecycle + +``` +new CloudflareAgentsClient() → Not connected + ↓ +runAgent() → Connecting + ↓ +WebSocket Open → Connected + ↓ +Send INIT message + ↓ +Receive events → Processing + ↓ +WebSocket Close → RUN_FINISHED + ↓ +Observable Complete +``` + +## Security + +### URL Validation + +The client validates and normalizes URLs: + +```typescript +// These are equivalent: +new CloudflareAgentsClient({ url: "https://worker.dev" }); +new CloudflareAgentsClient({ url: "wss://worker.dev" }); + +// Both convert to: wss://worker.dev +``` + +### Event Listener Cleanup + +The client properly removes event listeners on cleanup to prevent memory leaks: + +- When observable completes +- When observable errors +- When subscription is unsubscribed + +## Troubleshooting + +### "WebSocket not available" Error + +**Cause**: Running in Node.js without `ws` package. + +**Solution**: +```bash +npm install ws +``` + +```typescript +import WebSocket from "ws"; +globalThis.WebSocket = WebSocket; +``` + +### Connection Closes Immediately + +**Cause**: Server might not be handling WebSocket upgrade properly. + +**Solution**: Ensure your Cloudflare Worker uses `routeAgentRequest()` from the Agents SDK. + +### No Events Received + +**Cause**: Server might not be sending AG-UI compatible events. + +**Solution**: Use `AgentsToAGUIAdapter` on the server side to convert Vercel AI SDK streams to AG-UI events. + +### Parse Errors + +**Cause**: Server sending non-JSON or malformed messages. + +**Solution**: Check server logs. All messages must be valid JSON strings. + +## API Reference + +### Constructor + +```typescript +new CloudflareAgentsClient(config: CloudflareAgentsClientConfig) +``` + +**Config:** +- `url: string` - WebSocket URL to deployed Cloudflare Agent +- `agentId?: string` - Optional agent identifier +- `description?: string` - Optional agent description +- `threadId?: string` - Optional thread ID +- `initialMessages?: Message[]` - Optional initial messages +- `initialState?: any` - Optional initial state +- `debug?: boolean` - Enable debug logging + +### Methods + +#### `run(input: RunAgentInput): Observable` + +Connect to agent and stream events. + +**Parameters:** +- `input.messages: Message[]` - Message history +- `input.threadId?: string` - Thread ID +- `input.runId?: string` - Run ID +- `input.parentRunId?: string` - Parent run ID for branching +- `input.state?: any` - Initial state +- `input.tools?: Tool[]` - Available tools +- `input.context?: any[]` - Additional context + +**Returns:** Observable stream of AG-UI events + +#### `abortRun(): void` + +Abort the current run and close WebSocket connection. + +#### `clone(): CloudflareAgentsClient` + +Create a new instance with the same configuration. diff --git a/integrations/community/cloudflare-agents/typescript/docs/README.md b/integrations/community/cloudflare-agents/typescript/docs/README.md new file mode 100644 index 000000000..c3c41dda2 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/docs/README.md @@ -0,0 +1,115 @@ +# Cloudflare Agents AG-UI Integration + +AG-UI integration for Cloudflare Agents - utilities for connecting to and building agents on Cloudflare Workers. + +## Quick Start + +### Client: Connect to an Agent + +Connect to a deployed Cloudflare Agent from your AG-UI application: + +```typescript +import { CloudflareAgentsClient } from "@ag-ui/cloudflare-agents"; + +const agent = new CloudflareAgentsClient({ + url: "wss://your-worker.workers.dev" +}); + +agent.runAgent({ + messages: [{ role: "user", content: "Hello!" }] +}).subscribe({ + next: (event) => console.log(event.type, event), + error: (err) => console.error(err), + complete: () => console.log("Done") +}); +``` + +### Adapter: Build an Agent + +Use the adapter in your Cloudflare Worker to convert AI SDK streams to AG-UI events: + +```typescript +import { Agent } from "agents"; +import { AgentsToAGUIAdapter } from "@ag-ui/cloudflare-agents"; +import { streamText } from "ai"; +import { openai } from "@ai-sdk/openai"; + +export class MyAgent extends Agent { + private adapter = new AgentsToAGUIAdapter(); + + async onMessage(ws: WebSocket, raw: string | ArrayBuffer) { + const { messages } = JSON.parse( + typeof raw === "string" ? raw : new TextDecoder().decode(raw) + ); + + const stream = streamText({ + model: openai("gpt-4"), + messages + }); + + for await (const event of this.adapter.adaptStreamToAGUI( + stream, + crypto.randomUUID(), + crypto.randomUUID(), + messages + )) { + ws.send(JSON.stringify(event)); + } + } +} +``` + +## Documentation + +- **[CLIENT.md](./CLIENT.md)** - Client architecture, WebSocket connection, event transformation +- **[ADAPTER.md](./ADAPTER.md)** - Adapter patterns, streaming, state management + +## Architecture + +``` +┌─────────────────────────┐ +│ AG-UI Application │ +│ (Your Frontend) │ +└───────────┬─────────────┘ + │ WebSocket + ↓ +┌─────────────────────────┐ +│ CloudflareAgentsClient │ +│ (This Package) │ +└───────────┬─────────────┘ + │ WebSocket + ↓ +┌─────────────────────────┐ +│ Cloudflare Worker │ +│ (Your Deployed Agent) │ +└───────────┬─────────────┘ + │ Vercel AI SDK + ↓ +┌─────────────────────────┐ +│ LLM Provider │ +│ (OpenAI, Anthropic...) │ +└─────────────────────────┘ +``` + +## Features + +- WebSocket-based client for real-time streaming +- Adapter for Vercel AI SDK to AG-UI events +- Text streaming with automatic message chunking +- Tool call support with results +- State synchronization +- Message history snapshots +- Error handling and resilience +- TypeScript support + +## Installation + +```bash +npm install @ag-ui/cloudflare-agents +``` + +## Requirements + +- Node.js 18+ or modern browser +- Cloudflare Workers (for deployment) +- AG-UI framework diff --git a/integrations/community/cloudflare-agents/typescript/jest.config.js b/integrations/community/cloudflare-agents/typescript/jest.config.js new file mode 100644 index 000000000..1dd8acaf5 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/jest.config.js @@ -0,0 +1,9 @@ +/** @type {import('jest').Config} */ +export default { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/__tests__/**/*.test.ts'], + moduleNameMapper: { + '^@/(.*)$': '/src/$1', + }, +}; diff --git a/integrations/community/cloudflare-agents/typescript/package.json b/integrations/community/cloudflare-agents/typescript/package.json new file mode 100644 index 000000000..0a3e7dcb4 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/package.json @@ -0,0 +1,68 @@ +{ + "name": "@ag-ui/cloudflare-agents", + "version": "0.0.1", + "description": "AG-UI integration for Cloudflare Agents - Run AI agents on Cloudflare Workers with Durable Objects", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "sideEffects": false, + "files": [ + "dist/**", + "README.md" + ], + "keywords": [ + "ag-ui", + "cloudflare", + "workers", + "durable-objects", + "agents", + "ai", + "edge" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "rm -rf dist .turbo node_modules", + "typecheck": "tsc --noEmit", + "link:global": "pnpm link --global", + "unlink:global": "pnpm unlink --global" + }, + "peerDependencies": { + "@ag-ui/core": ">=0.0.37", + "@ag-ui/client": ">=0.0.40", + "rxjs": "7.8.1", + "ai": "^5.0.0", + "@cloudflare/workers-types": ">=4.0.0" + }, + "devDependencies": { + "@ag-ui/core": "workspace:*", + "@ag-ui/client": "workspace:*", + "@cloudflare/workers-types": "^4.20251106.1", + "@types/jest": "^29.5.14", + "@types/node": "^20.11.19", + "jest": "^29.7.0", + "ts-jest": "^29.1.2", + "tsup": "^8.0.2", + "typescript": "^5.3.3" + }, + "dependencies": { + "agents": "^0.2.23", + "nanoid": "^5.1.6", + "zod": "^3.25.76" + }, + "repository": { + "type": "git", + "url": "https://github.com/ag-ui-protocol/ag-ui", + "directory": "integrations/community/cloudflare-agents/typescript" + }, + "author": { + "name": "Audrey Klammer", + "email": "contact@audreyklammer.com", + "url": "https://github.com/Klammertime" + }, + "license": "MIT", + "private": false, + "publishConfig": { + "access": "public" + } +} diff --git a/integrations/community/cloudflare-agents/typescript/pnpm-lock.yaml b/integrations/community/cloudflare-agents/typescript/pnpm-lock.yaml new file mode 100644 index 000000000..adcdd49ad --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/pnpm-lock.yaml @@ -0,0 +1,3577 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + agents: + specifier: latest + version: 0.2.21(@cloudflare/workers-types@4.20251109.0)(react@19.2.0)(typescript@5.6.3) + devDependencies: + '@cloudflare/vitest-pool-workers': + specifier: ^0.10.5 + version: 0.10.5(@cloudflare/workers-types@4.20251109.0)(@vitest/runner@2.1.3)(@vitest/snapshot@2.1.3)(vitest@2.1.3(@types/node@24.10.0)) + '@cloudflare/workers-types': + specifier: latest + version: 4.20251109.0 + ajv: + specifier: ^8.17.1 + version: 8.17.1 + typescript: + specifier: 5.6.3 + version: 5.6.3 + vitest: + specifier: 2.1.3 + version: 2.1.3(@types/node@24.10.0) + wrangler: + specifier: 3.87.0 + version: 3.87.0(@cloudflare/workers-types@4.20251109.0) + +packages: + + '@ai-sdk/gateway@2.0.1': + resolution: {integrity: sha512-vPVIbnP35ZnayS937XLo85vynR85fpBQWHCdUweq7apzqFOTU2YkUd4V3msebEHbQ2Zro60ZShDDy9SMiyWTqA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai@2.0.53': + resolution: {integrity: sha512-GIkR3+Fyif516ftXv+YPSPstnAHhcZxNoR2s8uSHhQ1yBT7I7aQYTVwpjAuYoT3GR+TeP50q7onj2/nDRbT2FQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.12': + resolution: {integrity: sha512-ZtbdvYxdMoria+2SlNarEk6Hlgyf+zzcznlD55EAl+7VZvJaSg2sqPvwArY7L6TfDEDJsnCq0fdhBSkYo0Xqdg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} + + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} + engines: {node: '>= 16'} + + '@babel/runtime-corejs3@7.28.4': + resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@cloudflare/kv-asset-handler@0.3.4': + resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} + engines: {node: '>=16.13'} + + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + + '@cloudflare/unenv-preset@2.7.9': + resolution: {integrity: sha512-Drm7qlTKnvncEv+DANiQNEonq0H0LyIsoFZYJ6tJ8OhAoy5udIE8yp6BsVDYcIjcYLIybp4M7c/P7ly/56SoHg==} + peerDependencies: + unenv: 2.0.0-rc.24 + workerd: ^1.20250927.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/vitest-pool-workers@0.10.5': + resolution: {integrity: sha512-jUVzEOQga7bbRT9zq5ktnn8TkfR+PbQGEhxWu9EUoaCdr33zwXxNOqLyp1i1VueN2CMK+a5zNP40LZVTNPQoCw==} + peerDependencies: + '@vitest/runner': 2.0.x - 3.2.x + '@vitest/snapshot': 2.0.x - 3.2.x + vitest: 2.0.x - 3.2.x + + '@cloudflare/workerd-darwin-64@1.20241106.1': + resolution: {integrity: sha512-zxvaToi1m0qzAScrxFt7UvFVqU8DxrCO2CinM1yQkv5no7pA1HolpIrwZ0xOhR3ny64Is2s/J6BrRjpO5dM9Zw==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-64@1.20251105.0': + resolution: {integrity: sha512-nztUP35wTtUKM+681dBWtUNSySNWELTV+LY43oWy7ZhK19/iBJPQoFY7xpvF7zy4qOOShtise259B65DS4/71Q==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20241106.1': + resolution: {integrity: sha512-j3dg/42D/bPgfNP3cRUBxF+4waCKO/5YKwXNj+lnVOwHxDu+ne5pFw9TIkKYcWTcwn0ZUkbNZNM5rhJqRn4xbg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20251105.0': + resolution: {integrity: sha512-WS/dvPYTW/+gs8s0UvDqDY7wcuIAg/hUpjrMNGepr+Mo38vMU39FYhJQOly99oJCXxMluQqAnRKg09b/9Gr+Rg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20241106.1': + resolution: {integrity: sha512-Ih+Ye8E1DMBXcKrJktGfGztFqHKaX1CeByqshmTbODnWKHt6O65ax3oTecUwyC0+abuyraOpAtdhHNpFMhUkmw==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-64@1.20251105.0': + resolution: {integrity: sha512-RdHRHo/hpjR6sNw529FkmslVSz/K3Pb1+i3fIoqUrHCrZOUYzFyz3nLeZh4EYaAhcztLWiSTwBv54bcl4sG3wA==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20241106.1': + resolution: {integrity: sha512-mdQFPk4+14Yywn7n1xIzI+6olWM8Ybz10R7H3h+rk0XulMumCWUCy1CzIDauOx6GyIcSgKIibYMssVHZR30ObA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20251105.0': + resolution: {integrity: sha512-5zkxQCqLjwrqZVVJh92J2Drv6xifkP8kN2ltjHdwZQlVzfDW48d7tAtCm1ZooUv204ixvZFarusCfL+IRjExZg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20241106.1': + resolution: {integrity: sha512-4rtcss31E/Rb/PeFocZfr+B9i1MdrkhsTBWizh8siNR4KMmkslU2xs2wPaH1z8+ErxkOsHrKRa5EPLh5rIiFeg==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workerd-windows-64@1.20251105.0': + resolution: {integrity: sha512-6BpkfjBIbGR+4FBOcZGcWDLM0XQuoI6R9Dublj/BKf4pv0/xJ4zHdnaYUb5NIlC75L55Ouqw0CEJasoKlMjgnw==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-shared@0.7.1': + resolution: {integrity: sha512-46cP5FCrl3TrvHeoHLb5SRuiDMKH5kc9Yvo36SAfzt8dqJI/qJRoY1GP3ioHn/gP7v2QIoUOTAzIl7Ml7MnfrA==} + engines: {node: '>=16.7.0'} + + '@cloudflare/workers-types@4.20251109.0': + resolution: {integrity: sha512-/wMfoS6NmoY0GgKVoRUp4x0yiZM0eNXwXTTzM7gFJKcm+0NtZmzUzgXj6xpShkfWSrmug0mX7BbyaFMAMHFlPA==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emnapi/runtime@1.7.0': + resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} + + '@esbuild-plugins/node-globals-polyfill@0.2.3': + resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} + peerDependencies: + esbuild: '*' + + '@esbuild-plugins/node-modules-polyfill@0.2.2': + resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} + peerDependencies: + esbuild: '*' + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.17.19': + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.17.19': + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.17.19': + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.17.19': + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.17.19': + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.17.19': + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.17.19': + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.17.19': + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.17.19': + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.17.19': + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.17.19': + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.17.19': + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.17.19': + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.17.19': + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.17.19': + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.17.19': + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.17.19': + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.17.19': + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.17.19': + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.17.19': + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.17.19': + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.17.19': + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@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-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-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + 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-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + 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-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + 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-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + 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-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-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-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-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-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-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-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-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-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] + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@modelcontextprotocol/sdk@1.21.1': + resolution: {integrity: sha512-UyLFcJLDvUuZbGnaQqXFT32CpPpGj7VS19roLut6gkQVhb439xUzYWbsUvdI3ZPL+2hnFosuugtYWE0Mcs1rmQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.5': + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + + '@rollup/rollup-android-arm-eabi@4.53.1': + resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.1': + resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.1': + resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.1': + resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.1': + resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.1': + resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.1': + resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.1': + resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.1': + resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.1': + resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.1': + resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.1': + resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.1': + resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.1': + resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.1': + resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.1': + resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.1': + resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.1': + resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.1': + resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.1': + resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.1': + resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==} + cpu: [x64] + os: [win32] + + '@sindresorhus/is@7.1.1': + resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.12': + resolution: {integrity: sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} + + '@types/node@24.10.0': + resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} + + '@vercel/oidc@3.0.3': + resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} + engines: {node: '>= 20'} + + '@vitest/expect@2.1.3': + resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==} + + '@vitest/mocker@2.1.3': + resolution: {integrity: sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==} + peerDependencies: + '@vitest/spy': 2.1.3 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.3': + resolution: {integrity: sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==} + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/runner@2.1.3': + resolution: {integrity: sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==} + + '@vitest/snapshot@2.1.3': + resolution: {integrity: sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==} + + '@vitest/spy@2.1.3': + resolution: {integrity: sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==} + + '@vitest/utils@2.1.3': + resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agents@0.2.21: + resolution: {integrity: sha512-0Ty1MmUmgDoKjXAbzir6Jz+dau76qnl1+cRhHofdUfnba1b5xwvOzFAxRwhMna3o2BZBeX1qw1ZpY8TKb+dj4w==} + hasBin: true + peerDependencies: + react: '*' + viem: '>=2.0.0' + x402: ^0.6.5 + peerDependenciesMeta: + viem: + optional: true + x402: + optional: true + + ai@5.0.78: + resolution: {integrity: sha512-ec77fmQwJGLduswMrW4AAUGSOiu8dZaIwMmWHHGKsrMUFFS6ugfkTyx0srtuKYHNRRLRC2dT7cPirnUl98VnxA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + birpc@0.2.14: + resolution: {integrity: sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==} + + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + capnp-ts@0.7.0: + resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + core-js-pure@3.46.0: + resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cron-schedule@5.0.4: + resolution: {integrity: sha512-nH0a49E/kSVk6BeFgKZy4uUsy6D2A16p120h5bYD9ILBhQu7o2sJFH+WI4R731TSBQ0dB1Ik7inB/dRAB4C8QQ==} + engines: {node: '>=18'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.4.2: + resolution: {integrity: sha512-MwPZTKEPK2k8Qgfmqrd48ZKVvzSQjgW0lXLxiIBA8dQjtf/6mw6pggHNLcyDKyf+fI6eXxlQwPsfaCMTU5U+Bw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-polyfill@0.0.4: + resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-source@2.0.12: + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + itty-time@1.0.6: + resolution: {integrity: sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==} + + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-schema-to-typescript@15.0.4: + resolution: {integrity: sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==} + engines: {node: '>=16.0.0'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimetext@3.0.27: + resolution: {integrity: sha512-mUhWAsZD1N/K6dbN4+a5Yq78OPnYQw1ubOSMasBntsLQ2S7KVNlvDEA8dwpr4a7PszWMzeslKahAprtwYMgaBA==} + + miniflare@3.20241106.0: + resolution: {integrity: sha512-PjOoJKjUUofCueQskfhXlGvvHxZj36UAJAp1DnquMK88MFF50zCULblh0KXMSNM+bXeQYA94Gj06a7kfmBGxPw==} + engines: {node: '>=16.13'} + hasBin: true + + miniflare@4.20251105.0: + resolution: {integrity: sha512-n+lCQbGLPjHFm5EKMohxCl+hLIki9rIlJSU9FkYKdJ62cGacetmTH5IgWUZhUFFM+NqhqZLOuWXTAsoZTm0hog==} + engines: {node: '>=18.0.0'} + hasBin: true + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + ohash@1.1.6: + resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + partyserver@0.0.75: + resolution: {integrity: sha512-i/18vvdxuGjx+rpQ+fDdExlvQoRb7EfTF+6b+kA2ILEpHemtpLWV8NdgDrOPEklRNdCc/4WlzDtYn05d17aZAQ==} + peerDependencies: + '@cloudflare/workers-types': ^4.20240729.0 + + partysocket@1.1.6: + resolution: {integrity: sha512-LkEk8N9hMDDsDT0iDK0zuwUDFVrVMUXFXCeN3850Ng8wtjPqPBeJlwdeY6ROlJSEh3tPoTTasXoSBYH76y118w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rollup-plugin-inject@3.0.2: + resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + + rollup-plugin-node-polyfills@0.2.1: + resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + + rollup@4.53.1: + resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + 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} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + undici@7.14.0: + resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + engines: {node: '>=20.18.1'} + + unenv-nightly@2.0.0-20241024-111401-d4156ac: + resolution: {integrity: sha512-xJO1hfY+Te+/XnfCYrCbFbRcgu6XEODND1s5wnVbaBCkuQX7JXF7fHEXPrukFE2j8EOH848P8QN19VO47XN8hw==} + + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@2.1.3: + resolution: {integrity: sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.3: + resolution: {integrity: sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.3 + '@vitest/ui': 2.1.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + workerd@1.20241106.1: + resolution: {integrity: sha512-1GdKl0kDw8rrirr/ThcK66Kbl4/jd4h8uHx5g7YHBrnenY5SX1UPuop2cnCzYUxlg55kPjzIqqYslz1muRFgFw==} + engines: {node: '>=16'} + hasBin: true + + workerd@1.20251105.0: + resolution: {integrity: sha512-8D1UmsxrRr3Go7enbYCsYoiWeGn66u1WFNojPSgtjp7z8pV2cXskjr05vQ1OOzl7+rg1hDDofnCJqVwChMym8g==} + engines: {node: '>=16'} + hasBin: true + + wrangler@3.87.0: + resolution: {integrity: sha512-BExktnSLeGgG+uxgnr4h9eZ5nefdpTVcTHR+gEIWRvqk07XL04nJwpPYAOIPKPpB7E2tMdDJgNLGQN/CY6e1xQ==} + engines: {node: '>=16.17.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20241106.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + wrangler@4.46.0: + resolution: {integrity: sha512-WRROO7CL+MW/E44RMT4X7w32qPjufiPpGdey5D6H7iKzzVqfUkTRULxYBfWANiU1yGnsiCXQtu3Ap0G2TmohtA==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20251014.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + 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 + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + 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 + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@3.3.4: + resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + +snapshots: + + '@ai-sdk/gateway@2.0.1(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + '@vercel/oidc': 3.0.3 + zod: 3.25.76 + + '@ai-sdk/openai@2.0.53(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.12(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + + '@apidevtools/json-schema-ref-parser@11.9.3': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + + '@babel/runtime-corejs3@7.28.4': + dependencies: + core-js-pure: 3.46.0 + + '@babel/runtime@7.28.4': {} + + '@cloudflare/kv-asset-handler@0.3.4': + dependencies: + mime: 3.0.0 + + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + + '@cloudflare/unenv-preset@2.7.9(unenv@2.0.0-rc.24)(workerd@1.20251105.0)': + dependencies: + unenv: 2.0.0-rc.24 + optionalDependencies: + workerd: 1.20251105.0 + + '@cloudflare/vitest-pool-workers@0.10.5(@cloudflare/workers-types@4.20251109.0)(@vitest/runner@2.1.3)(@vitest/snapshot@2.1.3)(vitest@2.1.3(@types/node@24.10.0))': + dependencies: + '@vitest/runner': 2.1.3 + '@vitest/snapshot': 2.1.3 + birpc: 0.2.14 + cjs-module-lexer: 1.4.3 + devalue: 5.4.2 + miniflare: 4.20251105.0 + semver: 7.7.3 + vitest: 2.1.3(@types/node@24.10.0) + wrangler: 4.46.0(@cloudflare/workers-types@4.20251109.0) + zod: 3.25.76 + transitivePeerDependencies: + - '@cloudflare/workers-types' + - bufferutil + - utf-8-validate + + '@cloudflare/workerd-darwin-64@1.20241106.1': + optional: true + + '@cloudflare/workerd-darwin-64@1.20251105.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20241106.1': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20251105.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20241106.1': + optional: true + + '@cloudflare/workerd-linux-64@1.20251105.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20241106.1': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20251105.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20241106.1': + optional: true + + '@cloudflare/workerd-windows-64@1.20251105.0': + optional: true + + '@cloudflare/workers-shared@0.7.1': + dependencies: + mime: 3.0.0 + zod: 3.25.76 + + '@cloudflare/workers-types@4.20251109.0': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/runtime@1.7.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': + dependencies: + esbuild: 0.17.19 + + '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19)': + dependencies: + esbuild: 0.17.19 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.17.19': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm@0.17.19': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-x64@0.17.19': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.17.19': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.17.19': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.17.19': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.17.19': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.17.19': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm@0.17.19': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.17.19': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.17.19': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.17.19': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.17.19': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.17.19': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.17.19': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-x64@0.17.19': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.17.19': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.17.19': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/sunos-x64@0.17.19': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.17.19': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.17.19': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-x64@0.17.19': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + '@fastify/busboy@2.1.1': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.7.0 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsdevtools/ono@7.1.3': {} + + '@modelcontextprotocol/sdk@1.21.1': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/api@1.9.0': {} + + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.5': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.1.1 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.2': {} + + '@rollup/rollup-android-arm-eabi@4.53.1': + optional: true + + '@rollup/rollup-android-arm64@4.53.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.1': + optional: true + + '@rollup/rollup-darwin-x64@4.53.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.1': + optional: true + + '@sindresorhus/is@7.1.1': {} + + '@speed-highlight/core@1.2.12': {} + + '@standard-schema/spec@1.0.0': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/lodash@4.17.20': {} + + '@types/node-forge@1.3.14': + dependencies: + '@types/node': 24.10.0 + + '@types/node@24.10.0': + dependencies: + undici-types: 7.16.0 + + '@vercel/oidc@3.0.3': {} + + '@vitest/expect@2.1.3': + dependencies: + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 + chai: 5.3.3 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.21(@types/node@24.10.0))': + dependencies: + '@vitest/spy': 2.1.3 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 5.4.21(@types/node@24.10.0) + + '@vitest/pretty-format@2.1.3': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.3': + dependencies: + '@vitest/utils': 2.1.3 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.3': + dependencies: + '@vitest/pretty-format': 2.1.3 + magic-string: 0.30.21 + pathe: 1.1.2 + + '@vitest/spy@2.1.3': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.3': + dependencies: + '@vitest/pretty-format': 2.1.3 + loupe: 3.2.1 + tinyrainbow: 1.2.0 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-walk@8.3.2: {} + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.14.0: {} + + acorn@8.15.0: {} + + agents@0.2.21(@cloudflare/workers-types@4.20251109.0)(react@19.2.0)(typescript@5.6.3): + dependencies: + '@ai-sdk/openai': 2.0.53(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.21.1 + ai: 5.0.78(zod@3.25.76) + cron-schedule: 5.0.4 + json-schema: 0.4.0 + json-schema-to-typescript: 15.0.4 + mimetext: 3.0.27 + nanoid: 5.1.6 + partyserver: 0.0.75(@cloudflare/workers-types@4.20251109.0) + partysocket: 1.1.6 + react: 19.2.0 + yargs: 18.0.0 + zod: 3.25.76 + zod-to-ts: 1.2.0(typescript@5.6.3)(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@cloudflare/workers-types' + - supports-color + - typescript + + ai@5.0.78(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 2.0.1(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.12(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@6.2.2: {} + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + as-table@1.0.55: + dependencies: + printable-characters: 1.0.42 + + assertion-error@2.0.1: {} + + birpc@0.2.14: {} + + blake3-wasm@2.1.5: {} + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.1 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + capnp-ts@0.7.0: + dependencies: + debug: 4.4.3 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cjs-module-lexer@1.4.3: {} + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cookie@1.0.2: {} + + core-js-pure@3.46.0: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cron-schedule@5.0.4: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-uri-to-buffer@2.0.2: {} + + date-fns@4.1.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + defu@6.1.4: {} + + depd@2.0.0: {} + + detect-libc@2.1.2: {} + + devalue@5.4.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + emoji-regex@10.6.0: {} + + encodeurl@2.0.0: {} + + error-stack-parser-es@1.0.5: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.17.19: + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + estree-walker@0.6.1: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + etag@1.8.1: {} + + event-target-polyfill@0.0.4: {} + + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + + exit-hook@2.2.1: {} + + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + finalhandler@2.1.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-source@2.0.12: + dependencies: + data-uri-to-buffer: 2.0.2 + source-map: 0.6.1 + + glob-to-regexp@0.4.1: {} + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.3.4: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-promise@4.0.0: {} + + isexe@2.0.0: {} + + itty-time@1.0.6: {} + + js-base64@3.7.8: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-schema-to-typescript@15.0.4: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.9.3 + '@types/json-schema': 7.0.15 + '@types/lodash': 4.17.20 + is-glob: 4.0.3 + js-yaml: 4.1.0 + lodash: 4.17.21 + minimist: 1.2.8 + prettier: 3.6.2 + tinyglobby: 0.2.15 + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + kleur@4.1.5: {} + + lodash@4.17.21: {} + + loupe@3.2.1: {} + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mime@3.0.0: {} + + mimetext@3.0.27: + dependencies: + '@babel/runtime': 7.28.4 + '@babel/runtime-corejs3': 7.28.4 + js-base64: 3.7.8 + mime-types: 2.1.35 + + miniflare@3.20241106.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.15.0 + acorn-walk: 8.3.4 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.29.0 + workerd: 1.20241106.1 + ws: 8.18.3 + youch: 3.3.4 + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + miniflare@4.20251105.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + sharp: 0.33.5 + stoppable: 1.1.0 + undici: 7.14.0 + workerd: 1.20251105.0 + ws: 8.18.0 + youch: 4.1.0-beta.10 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + minimist@1.2.8: {} + + ms@2.1.3: {} + + mustache@4.2.0: {} + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + negotiator@1.0.0: {} + + node-forge@1.3.1: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + ohash@1.1.6: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + parseurl@1.3.3: {} + + partyserver@0.0.75(@cloudflare/workers-types@4.20251109.0): + dependencies: + '@cloudflare/workers-types': 4.20251109.0 + nanoid: 5.1.6 + + partysocket@1.1.6: + dependencies: + event-target-polyfill: 0.0.4 + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@6.3.0: {} + + path-to-regexp@8.3.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pkce-challenge@5.0.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.6.2: {} + + printable-characters@1.0.42: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + range-parser@1.2.1: {} + + raw-body@3.0.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + + react@19.2.0: {} + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + resolve.exports@2.0.3: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rollup-plugin-inject@3.0.2: + dependencies: + estree-walker: 0.6.1 + magic-string: 0.25.9 + rollup-pluginutils: 2.8.2 + + rollup-plugin-node-polyfills@0.2.1: + dependencies: + rollup-plugin-inject: 3.0.2 + + rollup-pluginutils@2.8.2: + dependencies: + estree-walker: 0.6.1 + + rollup@4.53.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.1 + '@rollup/rollup-android-arm64': 4.53.1 + '@rollup/rollup-darwin-arm64': 4.53.1 + '@rollup/rollup-darwin-x64': 4.53.1 + '@rollup/rollup-freebsd-arm64': 4.53.1 + '@rollup/rollup-freebsd-x64': 4.53.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.1 + '@rollup/rollup-linux-arm-musleabihf': 4.53.1 + '@rollup/rollup-linux-arm64-gnu': 4.53.1 + '@rollup/rollup-linux-arm64-musl': 4.53.1 + '@rollup/rollup-linux-loong64-gnu': 4.53.1 + '@rollup/rollup-linux-ppc64-gnu': 4.53.1 + '@rollup/rollup-linux-riscv64-gnu': 4.53.1 + '@rollup/rollup-linux-riscv64-musl': 4.53.1 + '@rollup/rollup-linux-s390x-gnu': 4.53.1 + '@rollup/rollup-linux-x64-gnu': 4.53.1 + '@rollup/rollup-linux-x64-musl': 4.53.1 + '@rollup/rollup-openharmony-arm64': 4.53.1 + '@rollup/rollup-win32-arm64-msvc': 4.53.1 + '@rollup/rollup-win32-ia32-msvc': 4.53.1 + '@rollup/rollup-win32-x64-gnu': 4.53.1 + '@rollup/rollup-win32-x64-msvc': 4.53.1 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.14 + node-forge: 1.3.1 + + semver@7.7.3: {} + + send@1.2.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + semver: 7.7.3 + 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 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + sourcemap-codec@1.4.8: {} + + stackback@0.0.2: {} + + stacktracey@2.1.8: + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + std-env@3.10.0: {} + + stoppable@1.1.0: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + supports-color@10.2.2: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + toidentifier@1.0.1: {} + + tslib@2.8.1: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typescript@5.6.3: {} + + ufo@1.6.1: {} + + undici-types@7.16.0: {} + + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@7.14.0: {} + + unenv-nightly@2.0.0-20241024-111401-d4156ac: + dependencies: + defu: 6.1.4 + ohash: 1.1.6 + pathe: 1.1.2 + ufo: 1.6.1 + + unenv@2.0.0-rc.24: + dependencies: + pathe: 2.0.3 + + unpipe@1.0.0: {} + + vary@1.1.2: {} + + vite-node@2.1.3(@types/node@24.10.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + pathe: 1.1.2 + vite: 5.4.21(@types/node@24.10.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.21(@types/node@24.10.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.53.1 + optionalDependencies: + '@types/node': 24.10.0 + fsevents: 2.3.3 + + vitest@2.1.3(@types/node@24.10.0): + dependencies: + '@vitest/expect': 2.1.3 + '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.21(@types/node@24.10.0)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.3 + '@vitest/snapshot': 2.1.3 + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 + chai: 5.3.3 + debug: 4.4.3 + magic-string: 0.30.21 + pathe: 1.1.2 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.1.1 + tinyrainbow: 1.2.0 + vite: 5.4.21(@types/node@24.10.0) + vite-node: 2.1.3(@types/node@24.10.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + workerd@1.20241106.1: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20241106.1 + '@cloudflare/workerd-darwin-arm64': 1.20241106.1 + '@cloudflare/workerd-linux-64': 1.20241106.1 + '@cloudflare/workerd-linux-arm64': 1.20241106.1 + '@cloudflare/workerd-windows-64': 1.20241106.1 + + workerd@1.20251105.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20251105.0 + '@cloudflare/workerd-darwin-arm64': 1.20251105.0 + '@cloudflare/workerd-linux-64': 1.20251105.0 + '@cloudflare/workerd-linux-arm64': 1.20251105.0 + '@cloudflare/workerd-windows-64': 1.20251105.0 + + wrangler@3.87.0(@cloudflare/workers-types@4.20251109.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.3.4 + '@cloudflare/workers-shared': 0.7.1 + '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) + '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) + blake3-wasm: 2.1.5 + chokidar: 4.0.3 + date-fns: 4.1.0 + esbuild: 0.17.19 + itty-time: 1.0.6 + miniflare: 3.20241106.0 + nanoid: 3.3.11 + path-to-regexp: 6.3.0 + resolve: 1.22.11 + resolve.exports: 2.0.3 + selfsigned: 2.4.1 + source-map: 0.6.1 + unenv: unenv-nightly@2.0.0-20241024-111401-d4156ac + workerd: 1.20241106.1 + xxhash-wasm: 1.1.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20251109.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + wrangler@4.46.0(@cloudflare/workers-types@4.20251109.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.7.9(unenv@2.0.0-rc.24)(workerd@1.20251105.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.4 + miniflare: 4.20251105.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.24 + workerd: 1.20251105.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20251109.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + ws@8.18.0: {} + + ws@8.18.3: {} + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yargs-parser@22.0.0: {} + + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@3.3.4: + dependencies: + cookie: 0.7.2 + mustache: 4.2.0 + stacktracey: 2.1.8 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.5 + '@speed-highlight/core': 1.2.12 + cookie: 1.0.2 + youch-core: 0.3.3 + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.6.3)(zod@3.25.76): + dependencies: + typescript: 5.6.3 + zod: 3.25.76 + + zod@3.22.3: {} + + zod@3.25.76: {} diff --git a/integrations/community/cloudflare-agents/typescript/src/adapter.ts b/integrations/community/cloudflare-agents/typescript/src/adapter.ts new file mode 100644 index 000000000..0b34e5bcb --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/src/adapter.ts @@ -0,0 +1,192 @@ +/** + * Adapter for converting Vercel AI SDK streams to AG-UI protocol events + */ + +import { type StreamTextResult } from "ai"; +import { + EventType, + type RunStartedEvent, + type RunFinishedEvent, + type RunErrorEvent, + type TextMessageChunkEvent, + type ToolCallChunkEvent, + type ToolCallResultEvent, + type MessagesSnapshotEvent, + type StateSnapshotEvent, + type StepStartedEvent, + type StepFinishedEvent, + type BaseEvent, + type Message, +} from "@ag-ui/client"; +import { nanoid } from "nanoid"; + +export class AgentsToAGUIAdapter { + /** + * Convert AI SDK stream to AG-UI event stream + * + * @param stream - StreamTextResult from Vercel AI SDK + * @param threadId - Thread ID for conversation tracking + * @param runId - Run ID for execution tracking + * @param inputMessages - Original input messages for snapshot + * @param parentRunId - Optional parent run ID for branching/time travel + * @param state - Optional agent state + * @returns AsyncGenerator yielding AG-UI events + */ + async *adaptStreamToAGUI( + stream: StreamTextResult, + threadId: string = nanoid(), + runId: string = nanoid(), + inputMessages: Message[] = [], + parentRunId?: string, + state?: any + ): AsyncGenerator { + const messageId = nanoid(); + + try { + const runStarted: RunStartedEvent = { + type: EventType.RUN_STARTED, + threadId, + runId, + timestamp: Date.now(), + ...(parentRunId && { parentRunId }), + input: { + threadId, + runId, + messages: inputMessages, + state: state || {}, + tools: [], + context: [], + ...(parentRunId && { parentRunId }), + }, + }; + yield runStarted; + + if (state && Object.keys(state).length > 0) { + const stateSnapshot: StateSnapshotEvent = { + type: EventType.STATE_SNAPSHOT, + snapshot: state, + timestamp: Date.now(), + }; + yield stateSnapshot; + } + + const textGenerationStep: StepStartedEvent = { + type: EventType.STEP_STARTED, + stepName: "Generating Response", + timestamp: Date.now(), + }; + yield textGenerationStep; + + let isFirstChunk = true; + for await (const chunk of stream.textStream) { + const textChunk: TextMessageChunkEvent = { + type: EventType.TEXT_MESSAGE_CHUNK, + delta: chunk, + timestamp: Date.now(), + ...(isFirstChunk && { messageId, role: "assistant" }), + }; + yield textChunk; + isFirstChunk = false; + } + + const textGenerationStepEnd: StepFinishedEvent = { + type: EventType.STEP_FINISHED, + stepName: "Generating Response", + timestamp: Date.now(), + }; + yield textGenerationStepEnd; + + const response = await stream; + const toolCalls = await response.toolCalls; + const toolResults = await response.toolResults; + const finalText = await response.text; + + if (toolCalls && toolCalls.length > 0) { + const toolExecutionStep: StepStartedEvent = { + type: EventType.STEP_STARTED, + stepName: "Executing Tools", + timestamp: Date.now(), + }; + yield toolExecutionStep; + + for (const toolCall of toolCalls) { + const toolCallChunk: ToolCallChunkEvent = { + type: EventType.TOOL_CALL_CHUNK, + toolCallId: toolCall.toolCallId, + toolCallName: toolCall.toolName, + parentMessageId: messageId, + delta: JSON.stringify( + "input" in toolCall ? toolCall.input : (toolCall as any).args + ), + timestamp: Date.now(), + }; + yield toolCallChunk; + } + + const toolExecutionStepEnd: StepFinishedEvent = { + type: EventType.STEP_FINISHED, + stepName: "Executing Tools", + timestamp: Date.now(), + }; + yield toolExecutionStepEnd; + } + + if (toolResults && toolResults.length > 0) { + for (const toolResult of toolResults) { + const resultEvent: ToolCallResultEvent = { + type: EventType.TOOL_CALL_RESULT, + messageId: nanoid(), + toolCallId: toolResult.toolCallId, + content: JSON.stringify( + "result" in toolResult + ? toolResult.result + : (toolResult as any).output + ), + role: "tool", + timestamp: Date.now(), + }; + yield resultEvent; + } + } + + const messagesSnapshot: MessagesSnapshotEvent = { + type: EventType.MESSAGES_SNAPSHOT, + messages: [ + ...inputMessages, + { + id: messageId, + role: "assistant", + content: finalText, + }, + ], + timestamp: Date.now(), + }; + yield messagesSnapshot; + + const runFinished: RunFinishedEvent = { + type: EventType.RUN_FINISHED, + threadId, + runId, + timestamp: Date.now(), + result: { + text: finalText, + messageId, + toolCallsCount: toolCalls?.length || 0, + toolResultsCount: toolResults?.length || 0, + }, + }; + yield runFinished; + } catch (error) { + const errorMessage = + error instanceof Error ? error.message : String(error); + + const runError: RunErrorEvent = { + type: EventType.RUN_ERROR, + message: errorMessage, + code: "STREAM_ERROR", + timestamp: Date.now(), + }; + yield runError; + } + } +} diff --git a/integrations/community/cloudflare-agents/typescript/src/client.ts b/integrations/community/cloudflare-agents/typescript/src/client.ts new file mode 100644 index 000000000..575125ffb --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/src/client.ts @@ -0,0 +1,263 @@ +/** + * Client-side Cloudflare Agents integration + * + * WebSocket-based client that connects to deployed Cloudflare Agents + * and translates their events into AG-UI protocol events. + */ + +import { + AbstractAgent, + AgentConfig, + randomUUID, + EventType, + type RunAgentInput, + type BaseEvent, + type RunStartedEvent, + type RunFinishedEvent, + type RunErrorEvent, + type TextMessageChunkEvent, + type StateSnapshotEvent, +} from "@ag-ui/client"; +import { Observable } from "rxjs"; + +export interface CloudflareAgentsClientConfig extends AgentConfig { + /** WebSocket URL to deployed Cloudflare Agent */ + url: string; +} + +/** + * AG-UI client for connecting to deployed Cloudflare Agents + * + * Extends AbstractAgent and provides WebSocket connection to Cloudflare Workers + * running the Cloudflare Agents SDK. + * + * @example + * ```ts + * const agent = new CloudflareAgentsClient({ + * url: "wss://your-worker.workers.dev" + * }); + * + * agent.runAgent({ + * messages: [{ role: "user", content: "Hello!" }] + * }).subscribe({ + * next: (event) => console.log(event.type, event), + * error: (err) => console.error(err), + * complete: () => console.log("Done") + * }); + * ``` + */ +export class CloudflareAgentsClient extends AbstractAgent { + private url: string; + private ws: any = null; + private currentMessageId: string | null = null; + + constructor(config: CloudflareAgentsClientConfig) { + super(config); + this.url = config.url; + } + + /** + * Connect to Cloudflare Agent and stream AG-UI events + * + * @param input - Run configuration including messages, threadId, runId + * @returns Observable stream of AG-UI events + */ + run(input: RunAgentInput): Observable { + return new Observable((subscriber) => { + const wsUrl = this.url + .replace(/^https:/, "wss:") + .replace(/^http:/, "ws:"); + + const onOpen = () => { + this.ws?.send( + JSON.stringify({ + type: "INIT", + messages: input.messages, + threadId: input.threadId, + runId: input.runId, + }) + ); + }; + + const onMessage = (event: any) => { + try { + const data = + typeof event.data === "string" ? event.data : event.data.toString(); + const cfEvent = JSON.parse(data); + + const aguiEvent = this.transformEvent(cfEvent); + if (aguiEvent) { + subscriber.next(aguiEvent); + } + } catch (err) { + console.error("Failed to parse message:", err); + subscriber.next({ + type: EventType.RUN_ERROR, + message: `Failed to parse server message: ${err instanceof Error ? err.message : "Unknown error"}`, + code: "PARSE_ERROR", + timestamp: Date.now(), + } as RunErrorEvent); + } + }; + + const onError = (error: any) => { + subscriber.next({ + type: EventType.RUN_ERROR, + message: "WebSocket connection error", + code: "WS_ERROR", + timestamp: Date.now(), + } as RunErrorEvent); + subscriber.error(error); + }; + + const onClose = () => { + this.currentMessageId = null; + const runFinishedEvent: RunFinishedEvent = { + type: EventType.RUN_FINISHED, + threadId: input.threadId, + runId: input.runId, + timestamp: Date.now(), + }; + subscriber.next(runFinishedEvent); + subscriber.complete(); + }; + + try { + const WebSocketConstructor = + typeof WebSocket !== "undefined" ? WebSocket : null; + + if (!WebSocketConstructor) { + throw new Error( + "WebSocket not available. In Node.js, install the 'ws' package." + ); + } + + this.ws = new WebSocketConstructor(wsUrl); + + const runStartedEvent: RunStartedEvent = { + type: EventType.RUN_STARTED, + threadId: input.threadId, + runId: input.runId, + timestamp: Date.now(), + ...(input.parentRunId && { parentRunId: input.parentRunId }), + input: { + threadId: input.threadId, + runId: input.runId, + messages: input.messages, + state: input.state || {}, + tools: input.tools || [], + context: input.context || [], + ...(input.parentRunId && { parentRunId: input.parentRunId }), + }, + }; + subscriber.next(runStartedEvent); + + if (this.ws.addEventListener) { + this.ws.addEventListener("open", onOpen); + this.ws.addEventListener("message", onMessage); + this.ws.addEventListener("error", onError); + this.ws.addEventListener("close", onClose); + } else { + this.ws.on("open", onOpen); + this.ws.on("message", onMessage); + this.ws.on("error", onError); + this.ws.on("close", onClose); + } + } catch (error) { + subscriber.error(error); + } + + return () => { + if (this.ws) { + if (this.ws.removeEventListener) { + this.ws.removeEventListener("open", onOpen); + this.ws.removeEventListener("message", onMessage); + this.ws.removeEventListener("error", onError); + this.ws.removeEventListener("close", onClose); + } else if (this.ws.off) { + this.ws.off("open", onOpen); + this.ws.off("message", onMessage); + this.ws.off("error", onError); + this.ws.off("close", onClose); + } + this.ws.close(); + this.ws = null; + } + this.currentMessageId = null; + }; + }); + } + + /** + * Transform Cloudflare Agent event to AG-UI protocol event + * + * Maps Cloudflare SDK events to AG-UI events: + * - TEXT_CHUNK → TEXT_MESSAGE_CHUNK + * - cf_agent_state → STATE_SNAPSHOT + * - READY, PONG → ignored + */ + private transformEvent(cfEvent: any): BaseEvent | null { + switch (cfEvent.type) { + case "TEXT_CHUNK": { + const incomingMessageId = cfEvent.messageId; + + if (incomingMessageId) { + this.currentMessageId = incomingMessageId; + } else if (!this.currentMessageId) { + this.currentMessageId = randomUUID(); + } + + return { + type: EventType.TEXT_MESSAGE_CHUNK, + messageId: this.currentMessageId, + role: "assistant", + delta: cfEvent.text, + timestamp: Date.now(), + } as TextMessageChunkEvent; + } + + case "cf_agent_state": { + return { + type: EventType.STATE_SNAPSHOT, + state: cfEvent.state || {}, + timestamp: Date.now(), + } as StateSnapshotEvent; + } + + case "READY": + case "PONG": + return null; + + default: + console.warn("Unknown Cloudflare event:", cfEvent.type); + return null; + } + } + + /** + * Abort the current agent run + */ + override abortRun() { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + this.currentMessageId = null; + super.abortRun(); + } + + /** + * Clone this agent instance + */ + override clone(): CloudflareAgentsClient { + return new CloudflareAgentsClient({ + agentId: this.agentId, + description: this.description, + threadId: this.threadId, + initialMessages: this.messages, + initialState: this.state, + debug: this.debug, + url: this.url, + }); + } +} diff --git a/integrations/community/cloudflare-agents/typescript/src/helpers.ts b/integrations/community/cloudflare-agents/typescript/src/helpers.ts new file mode 100644 index 000000000..c1557f254 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/src/helpers.ts @@ -0,0 +1,76 @@ +/** + * Helpers for streaming AG-UI events over SSE or NDJSON + */ + +import { type BaseEvent } from "@ag-ui/client"; +import { Observable } from "rxjs"; + +/** + * Create SSE response for streaming AG-UI events + */ +export function createSSEResponse( + events$: Observable, + additionalHeaders?: Record +): Response { + const { readable, writable } = new TransformStream(); + const writer = writable.getWriter(); + const encoder = new TextEncoder(); + + events$.subscribe({ + next: (event) => { + const data = `data: ${JSON.stringify(event)}\n\n`; + writer.write(encoder.encode(data)).catch(console.error); + }, + error: (error) => { + console.error("Stream error:", error); + writer.close().catch(console.error); + }, + complete: () => { + writer.close().catch(console.error); + }, + }); + + return new Response(readable, { + headers: { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", + ...additionalHeaders, + }, + }); +} + +/** + * Create NDJSON response for streaming AG-UI events + */ +export function createNDJSONResponse( + events$: Observable, + additionalHeaders?: Record +): Response { + const { readable, writable } = new TransformStream(); + const writer = writable.getWriter(); + const encoder = new TextEncoder(); + + events$.subscribe({ + next: (event) => { + const data = `${JSON.stringify(event)}\n`; + writer.write(encoder.encode(data)).catch(console.error); + }, + error: (error) => { + console.error("Stream error:", error); + writer.close().catch(console.error); + }, + complete: () => { + writer.close().catch(console.error); + }, + }); + + return new Response(readable, { + headers: { + "Content-Type": "application/x-ndjson", + "Cache-Control": "no-cache", + Connection: "keep-alive", + ...additionalHeaders, + }, + }); +} diff --git a/integrations/community/cloudflare-agents/typescript/src/index.ts b/integrations/community/cloudflare-agents/typescript/src/index.ts new file mode 100644 index 000000000..fb2e07ffd --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/src/index.ts @@ -0,0 +1,40 @@ +/** + * @ag-ui/cloudflare-agents + * + * AG-UI integration for Cloudflare Agents + * + * - Client: Connect to deployed Cloudflare Agents from AG-UI clients + * - Adapter: Convert Vercel AI SDK streams to AG-UI events + * - Helpers: SSE/NDJSON streaming utilities + * + * @packageDocumentation + */ + +// Client-side: Connect to deployed Cloudflare Agents +export { + CloudflareAgentsClient, + type CloudflareAgentsClientConfig, +} from "./client"; + +// Adapter for converting AI SDK streams to AG-UI events +export { AgentsToAGUIAdapter } from "./adapter"; + +// Response helpers for SSE/NDJSON streaming +export { createSSEResponse, createNDJSONResponse } from "./helpers"; + +// Re-export AG-UI types for convenience +export { + EventType, + type AgentConfig, + type BaseEvent, + type Message, + type MessagesSnapshotEvent, + type RunFinishedEvent, + type RunStartedEvent, + type RunAgentInput, + type TextMessageChunkEvent, + type ToolCallArgsEvent, + type ToolCallEndEvent, + type ToolCallStartEvent, + type ToolCallResultEvent, +} from "@ag-ui/client"; diff --git a/integrations/community/cloudflare-agents/typescript/tsconfig.json b/integrations/community/cloudflare-agents/typescript/tsconfig.json new file mode 100644 index 000000000..7879cddae --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/tsconfig.json @@ -0,0 +1,23 @@ +{ + //must be this way and unlike other integrations or will break + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "lib": ["ES2020"], + "moduleResolution": "bundler", + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": "./src", + "types": ["node", "@cloudflare/workers-types"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "tests"] +} diff --git a/integrations/community/cloudflare-agents/typescript/tsup.config.ts b/integrations/community/cloudflare-agents/typescript/tsup.config.ts new file mode 100644 index 000000000..5b4b87abe --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/tsup.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["cjs", "esm"], + dts: true, + splitting: false, + sourcemap: true, + clean: true, + minify: true, + external: ["@ag-ui/client", "@ag-ui/core", "rxjs", "ai", "cloudflare:workers"], +}); diff --git a/integrations/community/cloudflare-agents/typescript/vitest.config.ts b/integrations/community/cloudflare-agents/typescript/vitest.config.ts new file mode 100644 index 000000000..21930ecd8 --- /dev/null +++ b/integrations/community/cloudflare-agents/typescript/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config"; + +export default defineWorkersConfig({ + test: { + poolOptions: { + workers: { + wrangler: { configPath: "./wrangler.jsonc" }, + }, + }, + include: ["test/**/*.spec.ts"], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0758e2016..c9d0b9296 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,7 +134,7 @@ importers: version: 1.10.6(@types/react@19.2.2)(graphql@16.11.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@copilotkit/runtime': specifier: 1.10.6 - version: 1.10.6(iqshwn2xropb3vpfei3flnb2ay) + version: 1.10.6(840e2b71a9aad080e2f062f0362d8047) '@copilotkit/runtime-client-gql': specifier: 1.10.6 version: 1.10.6(graphql@16.11.0)(react@19.2.0) @@ -419,6 +419,37 @@ importers: specifier: ^5.3.3 version: 5.9.3 + integrations/community/cloudflare-agents/typescript: + dependencies: + rxjs: + specifier: 7.8.1 + version: 7.8.1 + devDependencies: + '@ag-ui/client': + specifier: workspace:* + version: link:../../../../sdks/typescript/packages/client + '@ag-ui/core': + specifier: workspace:* + version: link:../../../../sdks/typescript/packages/core + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 + '@types/node': + specifier: ^20.11.19 + version: 20.19.21 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.19.21) + ts-jest: + specifier: ^29.1.2 + version: 29.4.5(@babel/core@7.28.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.4))(esbuild@0.25.10)(jest-util@29.7.0)(jest@29.7.0(@types/node@20.19.21))(typescript@5.9.3) + tsup: + specifier: ^8.0.2 + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + typescript: + specifier: ^5.3.3 + version: 5.9.3 + integrations/community/spring-ai/typescript: dependencies: rxjs: @@ -485,10 +516,10 @@ importers: dependencies: '@langchain/core': specifier: ^0.3.66 - version: 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(zod@3.25.76)) + version: 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) '@langchain/langgraph-sdk': specifier: ^0.1.2 - version: 0.1.10(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 0.1.10(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) partial-json: specifier: ^0.1.7 version: 0.1.7 @@ -559,7 +590,7 @@ importers: version: 1.2.11(zod@3.25.76) '@copilotkit/runtime': specifier: ^1.10.5 - version: 1.10.6(jkrvcwfv2zltibfgwihn5nuqn4) + version: 1.10.6(1111ca0275ce3dffb944f3ec6a268e5c) '@mastra/client-js': specifier: ^0.15.2 version: 0.15.2(openapi-types@12.1.3)(react@19.2.0)(zod@3.25.76) @@ -1017,21 +1048,21 @@ packages: '@ag-ui/core@0.0.37': resolution: {integrity: sha512-7bmjPn1Ol0Zo00F+MrPr0eOwH4AFZbhmq/ZMhCsrMILtVYBiBLcLU9QFBpBL3Zm9MCHha8b79N7JE2FzwcMaVA==} + '@ag-ui/core@0.0.40': + resolution: {integrity: sha512-3HFpBzDp9SX4qmSdwYNug95l2XtWTaLIlBZ4Xk7wPES4y59BNSCPLtXQDvdnBi7ns+GqYyR8fRbv52vgN4SGhA==} + '@ag-ui/core@0.0.40-alpha.10': resolution: {integrity: sha512-VczUym5UTwVdvJPD95z4cqSEnrygjINqrqZX4ru1gnNlf8PPmhElNPdE/ZiFEgmZAXaxzK6rI+LB6iDx5NltQA==} - '@ag-ui/core@0.0.40-alpha.11': - resolution: {integrity: sha512-zGOl1NSF3QOgHCniu58BeicIuCRPiuxQFmDFXb5asciI60LLM9GdF+E58EwUczMsq/+ouK5lNp9lKdrduiURWg==} - '@ag-ui/encoder@0.0.35': resolution: {integrity: sha512-Ym0h0ZKIiD1Ld3+e3v/WQSogY62xs72ysoEBW1kt+dDs79QazBsW5ZlcBBj2DelEs9NrczQLxTVEvrkcvhrHqA==} + '@ag-ui/encoder@0.0.40': + resolution: {integrity: sha512-etYEQ5zft2GNdxU6Wq/z5JtHwCXIXeY3XBGzAeu9WjFwYU8qVO52qaMc55FlDZ55jHASVfUs2UYXQS2ApTtrYg==} + '@ag-ui/encoder@0.0.40-alpha.10': resolution: {integrity: sha512-aoBhFIcX+SGWzvw/FAK4+mHY6NIz5YA7DchjRCBWAyAGWrdSEObKRgPRifahOrl3hhKgSZo0MYwOin9Q33B+rg==} - '@ag-ui/encoder@0.0.40-alpha.11': - resolution: {integrity: sha512-T/sLvCIpDK2H7I3/XI3Sa8kMRBuvpZTs+zRJfcpFyzLWfDbqovOXLACmMeruap7tlmk2IPXcY9CVUmJsQPBwjw==} - '@ag-ui/langgraph@0.0.19-alpha.1': resolution: {integrity: sha512-rX8Y4LSxTXWUMFzCspO0c42b6YWGTuciP69Okrh7Lw3kpGsmFq/zmXoBLFz654Yuii2zLHl5mZvkBJ5a3nI6lA==} peerDependencies: @@ -1041,12 +1072,12 @@ packages: '@ag-ui/proto@0.0.35': resolution: {integrity: sha512-+rz3LAYHcR3D2xVgRKa7QE5mp+cwmZs6j+1XxG5dT7HNdg51uKea12L57EVY2bxE3JzpAvCIgOjFEmQCNH82pw==} + '@ag-ui/proto@0.0.40': + resolution: {integrity: sha512-rZpdttz9adJBDughHtW/89sc5jzk0cMo5np2TlMFKSopHvVoPaUv/Za73cfzBrAbUtNwnletZrcLCMtUWJ3Ipg==} + '@ag-ui/proto@0.0.40-alpha.10': resolution: {integrity: sha512-d7FzAIjWyQzaMEZyMkTMgIyW+qK7LUg2T/MpjAGqWjjcrWGk2Zh6DU/rNMwMbYnK/YlXS3Ljo5a5gI95SrLS+Q==} - '@ag-ui/proto@0.0.40-alpha.11': - resolution: {integrity: sha512-AlPaBBDdVAl8ZAu6fW/knFI4XDmSQJHDy6ADi+va8Hx4oPcG7cI9WhBaEVqETDLqhglRrFfGMt7KeQL+1NMo8Q==} - '@ai-sdk/anthropic@2.0.23': resolution: {integrity: sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw==} engines: {node: '>=18'} @@ -5278,8 +5309,8 @@ packages: '@urql/core@5.2.0': resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==} - '@vercel/oidc@3.0.2': - resolution: {integrity: sha512-JekxQ0RApo4gS4un/iMGsIL1/k4KUBe3HmnGcDvzHuFBdQdudEJgTqcsJC7y6Ul4Yw5CeykgvQbX2XeEJd0+DA==} + '@vercel/oidc@3.0.3': + resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} engines: {node: '>= 20'} '@webcontainer/env@1.1.1': @@ -7948,6 +7979,9 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@5.1.0: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} engines: {node: '>=12'} @@ -10395,12 +10429,12 @@ snapshots: rxjs: 7.8.1 zod: 3.25.76 - '@ag-ui/core@0.0.40-alpha.10': + '@ag-ui/core@0.0.40': dependencies: rxjs: 7.8.1 zod: 3.25.76 - '@ag-ui/core@0.0.40-alpha.11': + '@ag-ui/core@0.0.40-alpha.10': dependencies: rxjs: 7.8.1 zod: 3.25.76 @@ -10410,22 +10444,22 @@ snapshots: '@ag-ui/core': 0.0.35 '@ag-ui/proto': 0.0.35 + '@ag-ui/encoder@0.0.40': + dependencies: + '@ag-ui/core': 0.0.40 + '@ag-ui/proto': 0.0.40 + '@ag-ui/encoder@0.0.40-alpha.10': dependencies: '@ag-ui/core': 0.0.40-alpha.10 '@ag-ui/proto': 0.0.40-alpha.10 - '@ag-ui/encoder@0.0.40-alpha.11': - dependencies: - '@ag-ui/core': 0.0.40-alpha.11 - '@ag-ui/proto': 0.0.40-alpha.11 - - '@ag-ui/langgraph@0.0.19-alpha.1(@ag-ui/client@sdks+typescript+packages+client)(@ag-ui/core@sdks+typescript+packages+core)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@ag-ui/langgraph@0.0.19-alpha.1(@ag-ui/client@sdks+typescript+packages+client)(@ag-ui/core@sdks+typescript+packages+core)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@ag-ui/client': link:sdks/typescript/packages/client '@ag-ui/core': link:sdks/typescript/packages/core - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) partial-json: 0.1.7 rxjs: 7.8.1 transitivePeerDependencies: @@ -10441,15 +10475,15 @@ snapshots: '@ag-ui/core': 0.0.35 '@bufbuild/protobuf': 2.9.0 - '@ag-ui/proto@0.0.40-alpha.10': + '@ag-ui/proto@0.0.40': dependencies: - '@ag-ui/core': 0.0.40-alpha.10 + '@ag-ui/core': 0.0.40 '@bufbuild/protobuf': 2.9.0 '@protobuf-ts/protoc': 2.11.1 - '@ag-ui/proto@0.0.40-alpha.11': + '@ag-ui/proto@0.0.40-alpha.10': dependencies: - '@ag-ui/core': 0.0.40-alpha.11 + '@ag-ui/core': 0.0.40-alpha.10 '@bufbuild/protobuf': 2.9.0 '@protobuf-ts/protoc': 2.11.1 @@ -10463,7 +10497,7 @@ snapshots: dependencies: '@ai-sdk/provider': 2.0.0 '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) - '@vercel/oidc': 3.0.2 + '@vercel/oidc': 3.0.3 zod: 3.25.76 '@ai-sdk/google@2.0.17(zod@3.25.76)': @@ -11449,6 +11483,22 @@ snapshots: - encoding - utf-8-validate + '@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@5.12.2(ws@8.18.3)(zod@3.25.76))(zod@3.25.76)': + dependencies: + '@anthropic-ai/sdk': 0.27.3 + '@browserbasehq/sdk': 2.6.0 + '@playwright/test': 1.56.0 + deepmerge: 4.3.1 + dotenv: 16.6.1 + openai: 5.12.2(ws@8.18.3)(zod@3.25.76) + ws: 8.18.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@bufbuild/protobuf@2.9.0': {} '@cfworker/json-schema@4.1.1': {} @@ -11526,22 +11576,22 @@ snapshots: - encoding - graphql - '@copilotkit/runtime@1.10.6(iqshwn2xropb3vpfei3flnb2ay)': + '@copilotkit/runtime@1.10.6(1111ca0275ce3dffb944f3ec6a268e5c)': dependencies: '@ag-ui/client': link:sdks/typescript/packages/client '@ag-ui/core': link:sdks/typescript/packages/core - '@ag-ui/encoder': link:sdks/typescript/packages/encoder - '@ag-ui/langgraph': link:integrations/langgraph/typescript - '@ag-ui/proto': link:sdks/typescript/packages/proto + '@ag-ui/encoder': 0.0.40 + '@ag-ui/langgraph': 0.0.19-alpha.1(@ag-ui/client@sdks+typescript+packages+client)(@ag-ui/core@sdks+typescript+packages+core)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@ag-ui/proto': 0.0.40 '@anthropic-ai/sdk': 0.57.0 '@copilotkit/shared': 1.10.6 '@graphql-yoga/plugin-defer-stream': 3.16.0(graphql-yoga@5.16.0(graphql@16.11.0))(graphql@16.11.0) - '@langchain/aws': 0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76))) - '@langchain/community': 0.3.57(37emb7xvj5c4vxjobtfi323cve) + '@langchain/aws': 0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))) + '@langchain/community': 0.3.57(65f87bbbe59bfd1a89b851a9270f0080) '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(zod@3.25.76) - '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(react@19.2.0) - '@langchain/openai': 0.4.9(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(zod@3.25.76) + '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(react@19.2.0) + '@langchain/openai': 0.4.9(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) '@scarf/scarf': 1.4.0 class-transformer: 0.5.1 class-validator: 0.14.2 @@ -11550,7 +11600,7 @@ snapshots: graphql-scalars: 1.24.2(graphql@16.11.0) graphql-yoga: 5.16.0(graphql@16.11.0) groq-sdk: 0.5.0 - langchain: 0.3.36(@langchain/aws@0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76))))(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(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.1.0(@opentelemetry/api@1.9.0))(axios@1.12.2)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3) + langchain: 0.3.36(@langchain/aws@0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))))(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(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.1.0(@opentelemetry/api@1.9.0))(axios@1.12.2)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3) openai: 4.104.0(ws@8.18.3)(zod@3.25.76) partial-json: 0.1.7 pino: 9.13.1 @@ -11708,18 +11758,18 @@ snapshots: - ws - youtubei.js - '@copilotkit/runtime@1.10.6(jkrvcwfv2zltibfgwihn5nuqn4)': + '@copilotkit/runtime@1.10.6(840e2b71a9aad080e2f062f0362d8047)': dependencies: '@ag-ui/client': link:sdks/typescript/packages/client '@ag-ui/core': link:sdks/typescript/packages/core - '@ag-ui/encoder': 0.0.40-alpha.11 - '@ag-ui/langgraph': 0.0.19-alpha.1(@ag-ui/client@sdks+typescript+packages+client)(@ag-ui/core@sdks+typescript+packages+core)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@ag-ui/proto': 0.0.40-alpha.11 + '@ag-ui/encoder': link:sdks/typescript/packages/encoder + '@ag-ui/langgraph': link:integrations/langgraph/typescript + '@ag-ui/proto': link:sdks/typescript/packages/proto '@anthropic-ai/sdk': 0.57.0 '@copilotkit/shared': 1.10.6 '@graphql-yoga/plugin-defer-stream': 3.16.0(graphql-yoga@5.16.0(graphql@16.11.0))(graphql@16.11.0) '@langchain/aws': 0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76))) - '@langchain/community': 0.3.57(37emb7xvj5c4vxjobtfi323cve) + '@langchain/community': 0.3.57(59124af162a8d5d5d00a6010760bdd40) '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) '@langchain/google-gauth': 0.1.8(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(zod@3.25.76) '@langchain/langgraph-sdk': 0.0.70(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(react@19.2.0) @@ -12703,7 +12753,17 @@ snapshots: transitivePeerDependencies: - aws-crt - '@langchain/community@0.3.57(37emb7xvj5c4vxjobtfi323cve)': + '@langchain/aws@0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))': + dependencies: + '@aws-sdk/client-bedrock-agent-runtime': 3.910.0 + '@aws-sdk/client-bedrock-runtime': 3.910.0 + '@aws-sdk/client-kendra': 3.910.0 + '@aws-sdk/credential-provider-node': 3.910.0 + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + transitivePeerDependencies: + - aws-crt + + '@langchain/community@0.3.57(59124af162a8d5d5d00a6010760bdd40)': dependencies: '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.56.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@4.104.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76) '@ibm-cloud/watsonx-ai': 1.7.0 @@ -12734,6 +12794,65 @@ snapshots: google-auth-library: 8.9.0 ignore: 5.3.2 jsonwebtoken: 9.0.2 + lodash: 4.17.21 + pg: 8.16.3 + playwright: 1.56.0 + redis: 5.8.3 + weaviate-client: 3.9.0 + ws: 8.18.3 + 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@0.3.57(65f87bbbe59bfd1a89b851a9270f0080)': + dependencies: + '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.56.0)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@5.12.2(ws@8.18.3)(zod@3.25.76))(zod@3.25.76) + '@ibm-cloud/watsonx-ai': 1.7.0 + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + '@langchain/openai': 0.6.16(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + '@langchain/weaviate': 0.2.3(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))) + binary-extensions: 2.3.0 + expr-eval: 2.0.2 + flat: 5.0.2 + ibm-cloud-sdk-core: 5.4.3 + js-yaml: 4.1.0 + langchain: 0.3.36(@langchain/aws@0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))))(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(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.1.0(@opentelemetry/api@1.9.0))(axios@1.12.2)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3) + langsmith: 0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) + openai: 4.104.0(ws@8.18.3)(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.910.0 + '@aws-sdk/client-bedrock-runtime': 3.910.0 + '@aws-sdk/client-dynamodb': 3.910.0 + '@aws-sdk/client-kendra': 3.910.0 + '@aws-sdk/credential-provider-node': 3.910.0 + '@browserbasehq/sdk': 2.6.0 + '@smithy/util-utf8': 2.3.0 + '@upstash/redis': 1.35.6 + fast-xml-parser: 5.2.5 + google-auth-library: 8.9.0 + ignore: 5.3.2 + jsonwebtoken: 9.0.2 + lodash: 4.17.21 pg: 8.16.3 playwright: 1.56.0 redis: 5.8.3 @@ -12780,14 +12899,14 @@ snapshots: - '@opentelemetry/sdk-trace-base' - openai - '@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(zod@3.25.76))': + '@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(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.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(zod@3.25.76)) + langsmith: 0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -12808,6 +12927,14 @@ snapshots: transitivePeerDependencies: - zod + '@langchain/google-common@0.1.8(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(zod@3.25.76)': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + uuid: 10.0.0 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - zod + '@langchain/google-gauth@0.1.8(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(zod@3.25.76)': dependencies: '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) @@ -12818,6 +12945,16 @@ snapshots: - supports-color - zod + '@langchain/google-gauth@0.1.8(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(zod@3.25.76)': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + '@langchain/google-common': 0.1.8(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(zod@3.25.76) + google-auth-library: 8.9.0 + transitivePeerDependencies: + - encoding + - supports-color + - zod + '@langchain/langgraph-sdk@0.0.70(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(react@19.2.0)': dependencies: '@types/json-schema': 7.0.15 @@ -12828,25 +12965,24 @@ snapshots: '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) react: 19.2.0 - '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@langchain/langgraph-sdk@0.0.70(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(react@19.2.0)': dependencies: '@types/json-schema': 7.0.15 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@types/json-schema': 7.0.15 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(zod@3.25.76)) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -12861,6 +12997,17 @@ snapshots: - encoding - ws + '@langchain/openai@0.4.9(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 4.104.0(ws@8.18.3)(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - encoding + - ws + '@langchain/openai@0.6.16(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) @@ -12870,11 +13017,25 @@ snapshots: transitivePeerDependencies: - ws + '@langchain/openai@0.6.16(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + js-tiktoken: 1.0.21 + openai: 5.12.2(ws@8.18.3)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - ws + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))': dependencies: '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.21 + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + js-tiktoken: 1.0.21 + '@langchain/weaviate@0.2.3(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)))': dependencies: '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) @@ -12883,6 +13044,14 @@ snapshots: transitivePeerDependencies: - encoding + '@langchain/weaviate@0.2.3(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))': + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + uuid: 10.0.0 + weaviate-client: 3.9.0 + transitivePeerDependencies: + - encoding + '@libsql/client@0.15.15': dependencies: '@libsql/core': 0.15.15 @@ -15919,7 +16088,7 @@ snapshots: transitivePeerDependencies: - graphql - '@vercel/oidc@3.0.2': {} + '@vercel/oidc@3.0.3': {} '@webcontainer/env@1.1.1': {} @@ -17168,7 +17337,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: @@ -17190,7 +17359,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.37.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.37.0(jiti@2.6.1)))(eslint@9.37.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.37.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -18178,7 +18347,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.12.2(debug@4.4.3)) + retry-axios: 2.6.0(axios@1.12.2) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -18963,6 +19132,31 @@ snapshots: - openai - ws + langchain@0.3.36(@langchain/aws@0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))))(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(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.1.0(@opentelemetry/api@1.9.0))(axios@1.12.2)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3): + dependencies: + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)) + '@langchain/openai': 0.6.16(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))) + js-tiktoken: 1.0.21 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langsmith: 0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.25.76)) + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 10.0.0 + yaml: 2.8.1 + zod: 3.25.76 + optionalDependencies: + '@langchain/aws': 0.1.15(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76))) + axios: 1.12.2(debug@4.4.3) + handlebars: 4.7.8 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + - ws + langium@3.3.1: dependencies: chevrotain: 11.0.3 @@ -18986,7 +19180,7 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) openai: 4.104.0(ws@8.18.3)(zod@3.25.76) - langsmith@0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(zod@3.25.76)): + langsmith@0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(openai@5.12.2(ws@8.18.3)(zod@3.25.76)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -19146,6 +19340,9 @@ snapshots: lodash.sortby@4.7.0: {} + lodash@4.17.21: + optional: true + log-symbols@5.1.0: dependencies: chalk: 5.2.0 @@ -21044,7 +21241,7 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - retry-axios@2.6.0(axios@1.12.2(debug@4.4.3)): + retry-axios@2.6.0(axios@1.12.2): dependencies: axios: 1.12.2(debug@4.4.3)