diff --git a/typescript-sdk/apps/dojo/package.json b/typescript-sdk/apps/dojo/package.json index c5da36b8..a8d1300f 100644 --- a/typescript-sdk/apps/dojo/package.json +++ b/typescript-sdk/apps/dojo/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@ag-ui/agno": "workspace:*", + "@ag-ui/dify": "workspace:*", "@ag-ui/langgraph": "workspace:*", "@ag-ui/mastra": "workspace:*", "@ag-ui/middleware-starter": "workspace:*", diff --git a/typescript-sdk/apps/dojo/src/agents.ts b/typescript-sdk/apps/dojo/src/agents.ts index 8561805f..aabb9bd0 100644 --- a/typescript-sdk/apps/dojo/src/agents.ts +++ b/typescript-sdk/apps/dojo/src/agents.ts @@ -8,6 +8,12 @@ import { VercelAISDKAgent } from "@ag-ui/vercel-ai-sdk"; import { openai } from "@ai-sdk/openai"; import { LangGraphAgent } from "@ag-ui/langgraph"; import { AgnoAgent } from "@ag-ui/agno"; +import { DifyAgent } from "@ag-ui/dify"; + +// 检查必要的环境变量 +if (!process.env.DIFY_API_KEY) { + console.warn("警告: DIFY_API_KEY 环境变量未设置。Dify 集成将无法正常工作。"); +} export const agentsIntegrations: AgentIntegrationConfig[] = [ { @@ -112,4 +118,29 @@ export const agentsIntegrations: AgentIntegrationConfig[] = [ }; }, }, + { + id: "dify", + agents: async () => { + // 检查环境变量 + if (!process.env.DIFY_API_KEY) { + throw new Error("DIFY_API_KEY 环境变量未设置"); + } + + console.log("Dify 环境变量:", { + DIFY_API_KEY: process.env.DIFY_API_KEY, + DIFY_API_BASE_URL: process.env.DIFY_API_BASE_URL + }); + + return { + agentic_chat: new DifyAgent({ + apiKey: process.env.DIFY_API_KEY, + baseUrl: process.env.DIFY_API_BASE_URL, + }), + tool_based_generative_ui: new DifyAgent({ + apiKey: process.env.DIFY_API_KEY, + baseUrl: process.env.DIFY_API_BASE_URL, + }), + }; + }, + }, ]; diff --git a/typescript-sdk/apps/dojo/src/menu.ts b/typescript-sdk/apps/dojo/src/menu.ts index 150eff80..65262801 100644 --- a/typescript-sdk/apps/dojo/src/menu.ts +++ b/typescript-sdk/apps/dojo/src/menu.ts @@ -50,4 +50,12 @@ export const menuIntegrations: MenuIntegrationConfig[] = [ name: "Agno", features: ["agentic_chat"], }, + { + id: "dify", + name: "Dify", + features: [ + "agentic_chat", + "tool_based_generative_ui", + ], + }, ]; diff --git a/typescript-sdk/integrations/agno/src/global.d.ts b/typescript-sdk/integrations/agno/src/global.d.ts new file mode 100644 index 00000000..c2e8afa3 --- /dev/null +++ b/typescript-sdk/integrations/agno/src/global.d.ts @@ -0,0 +1,55 @@ +declare module "@ag-ui/client" { + export interface Tool { + name: string; + description: string; + parameters: Record; + } + + export interface RunAgentInput { + threadId: string; + runId: string; + messages: any[]; + tools?: Tool[]; + context?: any[]; + state?: any; + forwardedProps?: any; + } + + export enum EventType { + RUN_STARTED = "run_started", + RUN_FINISHED = "run_finished", + TEXT_MESSAGE_START = "text_message_start", + TEXT_MESSAGE_CONTENT = "text_message_content", + TEXT_MESSAGE_END = "text_message_end", + TOOL_CALL_START = "tool_call_start", + TOOL_CALL_ARGS = "tool_call_args", + TOOL_CALL_END = "tool_call_end", + } + + export interface AGUIEvent { + type: EventType; + timestamp: Date; + threadId?: string; + runId?: string; + messageId?: string; + role?: string; + delta?: string; + toolCallId?: string; + toolCallName?: string; + result?: string; + } + + export abstract class AbstractAgent { + constructor(config?: any); + abstract stream(input: RunAgentInput): AsyncGenerator; + } + + export class HttpAgent extends AbstractAgent { + constructor(config?: any); + stream(input: RunAgentInput): AsyncGenerator; + } + + export interface AgentConfig { + agentId?: string; + } +} \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/README.md b/typescript-sdk/integrations/dify/README.md new file mode 100644 index 00000000..0310dd78 --- /dev/null +++ b/typescript-sdk/integrations/dify/README.md @@ -0,0 +1,56 @@ +# AG-UI Dify Integration + +This package provides integration between AG-UI and Dify, allowing you to use Dify's AI agents with AG-UI's frontend components. + +## Installation + +```bash +pnpm add @ag-ui/dify +``` + +## Usage + +```typescript +import { DifyAgent } from "@ag-ui/dify"; + +// Create a Dify agent +const agent = new DifyAgent({ + apiKey: "your-dify-api-key", + baseUrl: "https://api.dify.ai/v1", // optional +}); + +// Use the agent with AG-UI components +``` + +## Features + +- Seamless integration with AG-UI's frontend components +- Support for streaming responses +- Tool calling support +- Message format conversion between AG-UI and Dify + +## API Reference + +### DifyAgent + +The main class for integrating Dify with AG-UI. + +#### Constructor + +```typescript +constructor(config: DifyClientConfig) +``` + +Parameters: +- `config`: Configuration object + - `apiKey`: Your Dify API key + - `baseUrl`: (optional) Dify API base URL, defaults to "https://api.dify.ai/v1" + +#### Methods + +- `stream(input: RunAgentInput)`: Streams the agent's response + - Returns: AsyncGenerator of AG-UI events + +## License + +MIT \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/package.json b/typescript-sdk/integrations/dify/package.json new file mode 100644 index 00000000..3ef3896c --- /dev/null +++ b/typescript-sdk/integrations/dify/package.json @@ -0,0 +1,22 @@ +{ + "name": "@ag-ui/dify", + "version": "0.1.0", + "private": true, + "main": "dist/index.js", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "rimraf dist" + }, + "dependencies": { + "@ag-ui/client": "workspace:*", + "rxjs": "7.8.1" + }, + "devDependencies": { + "rimraf": "^5.0.0", + "tsup": "^8.0.0", + "typescript": "^5.0.0" + } +} \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/src/global.d.ts b/typescript-sdk/integrations/dify/src/global.d.ts new file mode 100644 index 00000000..01fe72e6 --- /dev/null +++ b/typescript-sdk/integrations/dify/src/global.d.ts @@ -0,0 +1,43 @@ +declare module "@ag-ui/client" { + export interface Tool { + name: string; + description: string; + parameters: Record; + } + + export interface RunAgentInput { + threadId: string; + runId: string; + messages: any[]; + tools?: Tool[]; + } + + export enum EventType { + RUN_STARTED = "run_started", + RUN_FINISHED = "run_finished", + TEXT_MESSAGE_START = "text_message_start", + TEXT_MESSAGE_CONTENT = "text_message_content", + TEXT_MESSAGE_END = "text_message_end", + TOOL_CALL_START = "tool_call_start", + TOOL_CALL_ARGS = "tool_call_args", + TOOL_CALL_END = "tool_call_end", + } + + export interface AGUIEvent { + type: EventType; + timestamp: Date; + threadId?: string; + runId?: string; + messageId?: string; + role?: string; + delta?: string; + toolCallId?: string; + toolCallName?: string; + result?: string; + } + + export abstract class AbstractAgent { + constructor(config?: any); + abstract stream(input: RunAgentInput): AsyncGenerator; + } +} \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/src/index.ts b/typescript-sdk/integrations/dify/src/index.ts new file mode 100644 index 00000000..733195c0 --- /dev/null +++ b/typescript-sdk/integrations/dify/src/index.ts @@ -0,0 +1,207 @@ +import { AbstractAgent, RunAgentInput, AGUIEvent, EventType, Tool } from "@ag-ui/client"; +import { Observable, from } from "rxjs"; + +// 合并 types.ts 内容 +export interface DifyClientConfig { + apiKey: string; + baseUrl?: string; +} + +export interface DifyStreamResponse { + event: string; + conversation_id?: string; + message_id?: string; + answer?: string; + data?: any; + metadata?: any; +} + +// 合并 utils.ts 内容 +export function difyMessagesToAgui(messages: any[]): any[] { + return messages.map(msg => ({ + role: msg.role, + content: msg.content, + })); +} + +export function aguiMessagesToDify(messages: any[]): any[] { + return messages.map(msg => ({ + role: msg.role, + content: msg.content, + })); +} + +// 简单的Dify客户端实现 +class DifyClient { + private apiKey: string; + private baseUrl: string; + + constructor(config: DifyClientConfig) { + this.apiKey = config.apiKey; + this.baseUrl = config.baseUrl || "https://api.dify.ai/v1"; + console.log("DifyClient 配置:", { + baseUrl: this.baseUrl, + apiKeyLength: this.apiKey?.length || 0, + apiKeyPrefix: this.apiKey?.substring(0, 4) + "..." // 只打印前4位,保护密钥安全 + }); + } + + async *streamChat(params: { + messages: any[]; + tools?: any[]; + }): AsyncGenerator { + const url = `${this.baseUrl}/chat-messages`; + + // 从消息中提取最后一条用户消息作为 query + const lastUserMessage = [...params.messages].reverse().find((msg: { role: string }) => msg.role === 'user'); + const body = { + inputs: {}, + query: lastUserMessage?.content || '', + response_mode: "streaming", + conversation_id: "", // 如果需要保持对话上下文,这里需要传入 + user: "ag-ui-user", // 可以自定义用户标识 + }; + + console.log("Dify API 请求详情:", { + url, + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${this.apiKey}`, + }, + body: JSON.stringify(body, null, 2) + }); + + const response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${this.apiKey}`, + }, + body: JSON.stringify(body), + }); + + if (!response.ok) { + console.error("Dify API 错误响应:", { + status: response.status, + statusText: response.statusText, + url: response.url + }); + throw new Error(`Dify API error: ${response.statusText}`); + } + + const reader = response.body?.getReader(); + if (!reader) { + throw new Error("Failed to get response reader"); + } + + const decoder = new TextDecoder(); + let buffer = ""; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + buffer += decoder.decode(value, { stream: true }); + const lines = buffer.split("\n"); + buffer = lines.pop() || ""; + + for (const line of lines) { + if (line.trim() === "") continue; + if (!line.startsWith("data: ")) continue; + + try { + const data = JSON.parse(line.slice(6)); + console.log("Dify API 响应数据:", data); + yield data as DifyStreamResponse; + } catch (e) { + console.error("Failed to parse Dify stream data:", e); + } + } + } + } +} + +export class DifyAgent extends AbstractAgent { + private difyClient: DifyClient; + + constructor(config: DifyClientConfig) { + super(); + this.difyClient = new DifyClient(config); + } + + run(input: RunAgentInput): Observable { + return from(this.stream(input)); + } + + async *stream(input: RunAgentInput): AsyncGenerator { + // 1. 发送 AG-UI 输入到 Dify(转换为Dify消息格式) + const difyMessages = aguiMessagesToDify(input.messages); + const difyTools = input.tools?.map((tool: Tool) => ({ + name: tool.name, + description: tool.description, + parameters: tool.parameters, + })); + + // 2. 调用Dify流式对话接口 + const difyStream = await this.difyClient.streamChat({ + messages: difyMessages, + tools: difyTools, + }); + + // 3. 发送 AG-UI 事件:运行开始 + yield { + type: EventType.RUN_STARTED, + timestamp: new Date(), + threadId: input.threadId, + runId: input.runId, + }; + + // 4. 处理Dify流响应,转换为AG-UI事件 + let currentMessageId: string | undefined; + for await (const chunk of difyStream) { + switch (chunk.event) { + case "message": // 文本消息 + if (!currentMessageId) { + currentMessageId = chunk.message_id; + // 发送消息开始事件 + yield { + type: EventType.TEXT_MESSAGE_START, + messageId: currentMessageId, + role: "assistant", + timestamp: new Date(), + }; + } + // 发送文本内容增量事件 + if (chunk.answer) { + yield { + type: EventType.TEXT_MESSAGE_CONTENT, + messageId: currentMessageId, + delta: chunk.answer, + timestamp: new Date(), + }; + } + break; + + case "message_end": // 消息结束 + if (currentMessageId) { + yield { + type: EventType.TEXT_MESSAGE_END, + messageId: currentMessageId, + timestamp: new Date(), + }; + } + break; + + case "workflow_finished": // 工作流结束 + yield { + type: EventType.RUN_FINISHED, + timestamp: new Date(), + threadId: input.threadId, + runId: input.runId, + }; + break; + } + } + } +} \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/src/types.ts b/typescript-sdk/integrations/dify/src/types.ts new file mode 100644 index 00000000..99a2f56b --- /dev/null +++ b/typescript-sdk/integrations/dify/src/types.ts @@ -0,0 +1,50 @@ +import { ToolCall } from "@ag-ui/core"; + +// Dify 原始消息结构 +export interface DifyMessage { + id: string; + role: "user" | "assistant" | "system" | "tool"; + content: string; + tool_calls?: DifyToolCall[]; // 仅 assistant 消息可能有工具调用 + tool_call_id?: string; // 仅 tool 消息需要关联工具调用ID +} + +// Dify 工具调用结构 +export interface DifyToolCall { + id: string; + name: string; + arguments: string; // JSON 字符串 +} + +// Dify 流式响应类型 +export interface DifyStreamResponse { + type: "text" | "tool_call_start" | "tool_call_args" | "tool_call_end" | "message_end"; + messageId?: string; + text?: string; + toolCallId?: string; + toolName?: string; + arguments?: string; + result?: string; +} + +// Dify 客户端配置 +export interface DifyClientConfig { + apiKey: string; + baseUrl?: string; +} + +// AG-UI 消息类型扩展 +export interface AGUIMessage { + id: string; + role: "user" | "assistant" | "system" | "tool"; + content: string; + toolCalls?: { + id: string; + type: "function"; + function: { + name: string; + arguments: string; + }; + }[]; + toolCallId?: string; +} \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/src/utils.ts b/typescript-sdk/integrations/dify/src/utils.ts new file mode 100644 index 00000000..d35f233e --- /dev/null +++ b/typescript-sdk/integrations/dify/src/utils.ts @@ -0,0 +1,89 @@ +import { Message } from "@ag-ui/core"; +import { DifyMessage, DifyToolCall, AGUIMessage } from "./types"; + +/** + * 将 Dify 消息转换为 AG-UI 标准消息 + */ +export function difyMessagesToAgui(messages: DifyMessage[]): AGUIMessage[] { + return messages.map((msg) => { + switch (msg.role) { + case "user": + return { + id: msg.id, + role: "user", + content: msg.content, + }; + case "assistant": + return { + id: msg.id, + role: "assistant", + content: msg.content, + toolCalls: msg.tool_calls?.map((tc) => ({ + id: tc.id, + type: "function", + function: { + name: tc.name, + arguments: tc.arguments, + }, + })) || [], + }; + case "system": + return { + id: msg.id, + role: "system", + content: msg.content, + }; + case "tool": + return { + id: msg.id, + role: "tool", + content: msg.content, + toolCallId: msg.tool_call_id!, // 工具消息必须关联 tool_call_id + }; + default: + throw new Error(`Unsupported Dify message role: ${msg.role}`); + } + }); +} + +/** + * 将 AG-UI 消息转换为 Dify 接受的格式(用于反向交互) + */ +export function aguiMessagesToDify(messages: AGUIMessage[]): DifyMessage[] { + return messages.map((msg) => { + switch (msg.role) { + case "user": + return { + id: msg.id, + role: "user", + content: msg.content, + }; + case "assistant": + return { + id: msg.id, + role: "assistant", + content: msg.content, + tool_calls: msg.toolCalls?.map((tc) => ({ + id: tc.id, + name: tc.function.name, + arguments: tc.function.arguments, + })) || [], + }; + case "system": + return { + id: msg.id, + role: "system", + content: msg.content, + }; + case "tool": + return { + id: msg.id, + role: "tool", + content: msg.content, + tool_call_id: msg.toolCallId!, + }; + default: + throw new Error(`Unsupported AG-UI message role: ${msg.role}`); + } + }); +} \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/tsconfig.json b/typescript-sdk/integrations/dify/tsconfig.json new file mode 100644 index 00000000..3063fa6e --- /dev/null +++ b/typescript-sdk/integrations/dify/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "composite": true, + "skipLibCheck": true, + "moduleResolution": "node", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "include": ["src/**/*"], + "files": [ + "src/index.ts", + "src/types.ts", + "src/utils.ts" + ], + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/typescript-sdk/integrations/dify/tsup.config.ts b/typescript-sdk/integrations/dify/tsup.config.ts new file mode 100644 index 00000000..e24c0244 --- /dev/null +++ b/typescript-sdk/integrations/dify/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["cjs", "esm"], + dts: true, + splitting: false, + sourcemap: true, + clean: true, +}); \ No newline at end of file diff --git a/typescript-sdk/integrations/langgraph/src/global.d.ts b/typescript-sdk/integrations/langgraph/src/global.d.ts new file mode 100644 index 00000000..c94a7a11 --- /dev/null +++ b/typescript-sdk/integrations/langgraph/src/global.d.ts @@ -0,0 +1,52 @@ +declare module "@ag-ui/client" { + export interface Tool { + name: string; + description: string; + parameters: Record; + } + + export interface RunAgentInput { + threadId: string; + runId: string; + messages: any[]; + tools?: Tool[]; + } + + export enum EventType { + RUN_STARTED = "run_started", + RUN_FINISHED = "run_finished", + TEXT_MESSAGE_START = "text_message_start", + TEXT_MESSAGE_CONTENT = "text_message_content", + TEXT_MESSAGE_END = "text_message_end", + TOOL_CALL_START = "tool_call_start", + TOOL_CALL_ARGS = "tool_call_args", + TOOL_CALL_END = "tool_call_end", + } + + export interface AGUIEvent { + type: EventType; + timestamp: Date; + threadId?: string; + runId?: string; + messageId?: string; + role?: string; + delta?: string; + toolCallId?: string; + toolCallName?: string; + result?: string; + } + + export abstract class AbstractAgent { + constructor(config?: any); + abstract stream(input: RunAgentInput): AsyncGenerator; + } + + export class HttpAgent extends AbstractAgent { + constructor(config?: any); + stream(input: RunAgentInput): AsyncGenerator; + } + + export interface AgentConfig { + agentId?: string; + } +} \ No newline at end of file diff --git a/typescript-sdk/integrations/langgraph/src/index.ts b/typescript-sdk/integrations/langgraph/src/index.ts index 9f6528f9..f5936699 100644 --- a/typescript-sdk/integrations/langgraph/src/index.ts +++ b/typescript-sdk/integrations/langgraph/src/index.ts @@ -52,6 +52,7 @@ import { getStreamPayloadInput, langchainMessagesToAgui, } from "@/utils"; +import { AGUIEvent } from "@ag-ui/client"; export type ProcessedEvents = | TextMessageStartEvent @@ -88,6 +89,7 @@ export interface LangGraphAgentConfig extends AgentConfig { assistantConfig?: LangGraphConfig; agentName?: string; graphId: string; + agentId?: string; } export class LangGraphAgent extends AbstractAgent { @@ -98,6 +100,7 @@ export class LangGraphAgent extends AbstractAgent { assistant?: Assistant; messagesInProcess: MessagesInProgressRecord; activeRun?: RunMetadata; + agentId: string; // @ts-expect-error no need to initialize subscriber right now subscriber: Subscriber; @@ -106,6 +109,7 @@ export class LangGraphAgent extends AbstractAgent { this.messagesInProcess = {}; this.agentName = config.agentName; this.graphId = config.graphId; + this.agentId = config.agentId || randomUUID(); this.assistantConfig = config.assistantConfig; this.client = config?.client ?? @@ -738,6 +742,68 @@ export class LangGraphAgent extends AbstractAgent { tools: [...(state.tools ?? []), ...tools], }; } + + async *stream(input: RunAgentInput): AsyncGenerator { + // 强制类型断言,确保兼容 + const { threadId, runId, messages, tools } = input as RunAgentInput; + const lastMessage = messages[messages.length - 1]; + + // 发送运行开始事件 + yield { + type: EventType.RUN_STARTED, + timestamp: new Date(), + threadId, + runId, + }; + + // 发送文本消息开始事件 + yield { + type: EventType.TEXT_MESSAGE_START, + timestamp: new Date(), + threadId, + runId, + messageId: lastMessage.id, + role: "assistant", + }; + + // 处理消息并生成响应 + const response = await this.processMessage(lastMessage, tools || []); + + // 发送文本消息内容事件 + yield { + type: EventType.TEXT_MESSAGE_CONTENT, + timestamp: new Date(), + threadId, + runId, + messageId: lastMessage.id, + role: "assistant", + delta: response, + }; + + // 发送文本消息结束事件 + yield { + type: EventType.TEXT_MESSAGE_END, + timestamp: new Date(), + threadId, + runId, + messageId: lastMessage.id, + role: "assistant", + }; + + // 发送运行结束事件 + yield { + type: EventType.RUN_FINISHED, + timestamp: new Date(), + threadId, + runId, + }; + } + + private async processMessage(lastMessage: any, tools: any[]): Promise { + // 这里可以根据实际业务逻辑处理消息和工具调用 + // 目前简单返回消息内容 + return lastMessage.content || ""; + } } export * from './types' diff --git a/typescript-sdk/integrations/server-starter-all-features/src/global.d.ts b/typescript-sdk/integrations/server-starter-all-features/src/global.d.ts new file mode 100644 index 00000000..87000052 --- /dev/null +++ b/typescript-sdk/integrations/server-starter-all-features/src/global.d.ts @@ -0,0 +1,48 @@ +declare module "@ag-ui/client" { + export interface Tool { + name: string; + description: string; + parameters: Record; + } + + export interface RunAgentInput { + threadId: string; + runId: string; + messages: any[]; + tools?: Tool[]; + } + + export enum EventType { + RUN_STARTED = "run_started", + RUN_FINISHED = "run_finished", + TEXT_MESSAGE_START = "text_message_start", + TEXT_MESSAGE_CONTENT = "text_message_content", + TEXT_MESSAGE_END = "text_message_end", + TOOL_CALL_START = "tool_call_start", + TOOL_CALL_ARGS = "tool_call_args", + TOOL_CALL_END = "tool_call_end", + } + + export interface AGUIEvent { + type: EventType; + timestamp: Date; + threadId?: string; + runId?: string; + messageId?: string; + role?: string; + delta?: string; + toolCallId?: string; + toolCallName?: string; + result?: string; + } + + export abstract class AbstractAgent { + constructor(config?: any); + abstract stream(input: RunAgentInput): AsyncGenerator; + } + + export class HttpAgent extends AbstractAgent { + constructor(config?: any); + stream(input: RunAgentInput): AsyncGenerator; + } +} \ No newline at end of file diff --git a/typescript-sdk/integrations/server-starter/src/global.d.ts b/typescript-sdk/integrations/server-starter/src/global.d.ts new file mode 100644 index 00000000..87000052 --- /dev/null +++ b/typescript-sdk/integrations/server-starter/src/global.d.ts @@ -0,0 +1,48 @@ +declare module "@ag-ui/client" { + export interface Tool { + name: string; + description: string; + parameters: Record; + } + + export interface RunAgentInput { + threadId: string; + runId: string; + messages: any[]; + tools?: Tool[]; + } + + export enum EventType { + RUN_STARTED = "run_started", + RUN_FINISHED = "run_finished", + TEXT_MESSAGE_START = "text_message_start", + TEXT_MESSAGE_CONTENT = "text_message_content", + TEXT_MESSAGE_END = "text_message_end", + TOOL_CALL_START = "tool_call_start", + TOOL_CALL_ARGS = "tool_call_args", + TOOL_CALL_END = "tool_call_end", + } + + export interface AGUIEvent { + type: EventType; + timestamp: Date; + threadId?: string; + runId?: string; + messageId?: string; + role?: string; + delta?: string; + toolCallId?: string; + toolCallName?: string; + result?: string; + } + + export abstract class AbstractAgent { + constructor(config?: any); + abstract stream(input: RunAgentInput): AsyncGenerator; + } + + export class HttpAgent extends AbstractAgent { + constructor(config?: any); + stream(input: RunAgentInput): AsyncGenerator; + } +} \ No newline at end of file diff --git a/typescript-sdk/packages/client/tsconfig.json b/typescript-sdk/packages/client/tsconfig.json index d12ec063..5fe1413d 100644 --- a/typescript-sdk/packages/client/tsconfig.json +++ b/typescript-sdk/packages/client/tsconfig.json @@ -17,7 +17,8 @@ "paths": { "@/*": ["./src/*"] }, - "stripInternal": true + "stripInternal": true, + "composite": true }, "include": ["src"], "exclude": ["node_modules", "dist"] diff --git a/typescript-sdk/pnpm-lock.yaml b/typescript-sdk/pnpm-lock.yaml index 3c2026c9..6f27d09f 100644 --- a/typescript-sdk/pnpm-lock.yaml +++ b/typescript-sdk/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@ag-ui/core': specifier: workspace:* version: link:../../packages/core + '@ag-ui/dify': + specifier: workspace:* + version: link:../../integrations/dify '@ag-ui/encoder': specifier: workspace:* version: link:../../packages/encoder @@ -239,6 +242,25 @@ importers: specifier: ^5.3.3 version: 5.8.2 + integrations/dify: + dependencies: + '@ag-ui/client': + specifier: workspace:* + version: link:../../packages/client + rxjs: + specifier: 7.8.1 + version: 7.8.1 + devDependencies: + rimraf: + specifier: ^5.0.0 + version: 5.0.10 + tsup: + specifier: ^8.0.0 + version: 8.5.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.2)(yaml@2.8.0) + typescript: + specifier: ^5.0.0 + version: 5.8.2 + integrations/langgraph: dependencies: '@ag-ui/client': @@ -1386,67 +1408,79 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [glibc] '@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] + libc: [musl] '@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] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -2209,24 +2243,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@15.2.1': resolution: {integrity: sha512-3v0pF/adKZkBWfUffmB/ROa+QcNTrnmYG4/SS+r52HPwAK479XcWoES2I+7F7lcbqc7mTeVXrIvb4h6rR/iDKg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@15.2.1': resolution: {integrity: sha512-RbsVq2iB6KFJRZ2cHrU67jLVLKeuOIhnQB05ygu5fCNgg8oTewxweJE8XlLV+Ii6Y6u4EHwETdUiRNXIAfpBww==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@15.2.1': resolution: {integrity: sha512-QHsMLAyAIu6/fWjHmkN/F78EFPKmhQlyX5C8pRIS2RwVA7z+t9cTb0IaYWC3EHLOTjsU7MNQW+n2xGXr11QPpg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@15.2.1': resolution: {integrity: sha512-Gk42XZXo1cE89i3hPLa/9KZ8OuupTjkDmhLaMKFohjf9brOeZVEa3BQy1J9s9TWUqPhgAEbwv6B2+ciGfe54Vw==} @@ -3115,56 +3153,67 @@ packages: resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.41.0': resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.41.0': resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.41.0': resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.41.0': resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.41.0': resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.41.0': resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.41.0': resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.41.0': resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.41.0': resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.41.0': resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} @@ -3479,24 +3528,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.7': resolution: {integrity: sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.7': resolution: {integrity: sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.7': resolution: {integrity: sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.7': resolution: {integrity: sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A==} @@ -3944,41 +3997,49 @@ packages: resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.7.2': resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.7.2': resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.7.2': resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.7.2': resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} @@ -6087,24 +6148,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.1: resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.1: resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.1: resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.1: resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} @@ -7317,6 +7382,10 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + rollup@4.41.0: resolution: {integrity: sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -9524,7 +9593,7 @@ snapshots: '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9538,7 +9607,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -12338,7 +12407,7 @@ snapshots: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.2) '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 eslint: 9.27.0(jiti@2.4.2) typescript: 5.8.2 transitivePeerDependencies: @@ -12353,7 +12422,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.2) '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2) - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 eslint: 9.27.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 @@ -12366,7 +12435,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12508,7 +12577,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -13066,12 +13135,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.1(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - decamelize@1.2.0: {} decode-named-character-reference@1.1.0: @@ -13368,7 +13431,7 @@ snapshots: eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.27.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 eslint: 9.27.0(jiti@2.4.2) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 @@ -13492,7 +13555,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -13771,7 +13834,7 @@ snapshots: follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 for-each@0.3.5: dependencies: @@ -14196,14 +14259,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -14222,7 +14285,7 @@ snapshots: '@types/tough-cookie': 4.0.5 axios: 1.9.0(debug@4.4.1) camelcase: 6.3.0 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 dotenv: 16.5.0 extend: 3.0.2 file-type: 16.5.4 @@ -15738,7 +15801,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -15760,7 +15823,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -16697,7 +16760,7 @@ snapshots: require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -16742,6 +16805,10 @@ snapshots: reusify@1.1.0: {} + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + rollup@4.41.0: dependencies: '@types/estree': 1.0.7