diff --git a/packages/server/package.json b/packages/server/package.json new file mode 100644 index 0000000000000000000000000000000000000000..459abb782305bac7f3943b046e37ca205e0319dc --- /dev/null +++ b/packages/server/package.json @@ -0,0 +1,51 @@ +{ + "name": "@llamaindex/server", + "description": "LlamaIndex Server", + "version": "0.0.1", + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "exports": { + ".": { + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + } + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/run-llama/LlamaIndexTS.git", + "directory": "packages/server" + }, + "scripts": { + "build": "bunchee", + "dev": "bunchee --watch", + "test": "vitest run" + }, + "devDependencies": { + "bunchee": "6.4.0", + "vitest": "^2.1.5", + "@types/node": "^22.9.0", + "@types/express": "^4.17.21" + }, + "dependencies": { + "@llamaindex/core": "workspace:*", + "@llamaindex/env": "workspace:*", + "@llamaindex/tools": "workspace:*", + "llamaindex": "workspace:*", + "ai": "^4.0.3", + "@llamaindex/openai": "^0.1.52", + "@llamaindex/readers": "^2.0.0" + }, + "peerDependencies": { + "express": "^4.18.2" + } +} diff --git a/packages/server/src/helper.ts b/packages/server/src/helper.ts new file mode 100644 index 0000000000000000000000000000000000000000..88e30256f7f4e9cc4cdbba2b43a15c23974b71aa --- /dev/null +++ b/packages/server/src/helper.ts @@ -0,0 +1,25 @@ +import type { Message } from "ai"; +import type { Response as ExpressResponse } from "express"; + +export async function pipeExpressResponse( + expressResponse: ExpressResponse, + streamResponse: Response, +) { + if (!streamResponse.body) return; + const reader = streamResponse.body.getReader(); + while (true) { + const { done, value } = await reader.read(); + if (done) return expressResponse.end(); + expressResponse.write(value); + } +} + +export function getUserMessageContent(messages: Message[]): string { + const userMessageContent = messages[messages.length - 1]?.content; + if (!userMessageContent) { + throw new Error( + "Messages are required and the last message must be from the user", + ); + } + return userMessageContent; +} diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..14aebb5ec478c66228eadb3bed3e31914ed970bc --- /dev/null +++ b/packages/server/src/index.ts @@ -0,0 +1,4 @@ +export * from "./server"; + +export * from "./workflow/tools"; // helper functions for tools +export * from "./workflow/type"; // type definitions for the workflow diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..7a267528987cb3522c25871552e381a1d99018fc --- /dev/null +++ b/packages/server/src/server.ts @@ -0,0 +1,52 @@ +import type { Message } from "ai"; +import express from "express"; +import { getUserMessageContent, pipeExpressResponse } from "./helper"; +import { chatWithWorkflow } from "./workflow/stream"; +import type { ServerWorkflow } from "./workflow/type"; + +export interface LlamaIndexServerParams { + workflow: ServerWorkflow; + port?: number; +} + +export class LlamaIndexServer { + app: express.Application; + workflow: ServerWorkflow; + port: number; + + constructor({ workflow, port = 8000 }: LlamaIndexServerParams) { + this.app = express(); + this.workflow = workflow; + this.port = port; + this.setupRoutes(); + } + + public chatController = async ( + req: express.Request, + res: express.Response, + ) => { + try { + const { messages } = req.body as { messages: Message[] }; + const userMessageContent = getUserMessageContent(messages); + const streamResponse = await chatWithWorkflow( + userMessageContent, + this.workflow, + ); + await pipeExpressResponse(res, streamResponse); + } catch (error) { + console.error("Chat error:", error); + res.status(500).json({ error: "Internal server error" }); + } + }; + + protected setupRoutes() { + this.app.use(express.json()); + this.app.post("/chat", this.chatController); + } + + public start() { + this.app.listen(this.port, () => { + console.log(`LlamaIndex server running on port ${this.port}`); + }); + } +} diff --git a/packages/server/src/workflow/stream.ts b/packages/server/src/workflow/stream.ts new file mode 100644 index 0000000000000000000000000000000000000000..98a0de4464405abdb45d139ea37598c696f14404 --- /dev/null +++ b/packages/server/src/workflow/stream.ts @@ -0,0 +1,83 @@ +import { LlamaIndexAdapter, StreamData, type JSONValue } from "ai"; +import { + EngineResponse, + StopEvent, + Workflow, + WorkflowContext, + WorkflowEvent, + type ChatResponseChunk, +} from "llamaindex"; +import { ReadableStream } from "stream/web"; +import { AgentRunEvent, type AgentInput } from "./type"; + +export async function chatWithWorkflow( + message: string, + workflow: Workflow<null, AgentInput, ChatResponseChunk>, +): Promise<Response> { + const context = workflow.run({ message }); + const { stream, dataStream } = await createStreamFromWorkflowContext(context); + const response = LlamaIndexAdapter.toDataStreamResponse(stream, { + data: dataStream, + }); + return response; +} + +async function createStreamFromWorkflowContext<Input, Output, Context>( + context: WorkflowContext<Input, Output, Context>, +): Promise<{ stream: ReadableStream<EngineResponse>; dataStream: StreamData }> { + const dataStream = new StreamData(); + let generator: AsyncGenerator<ChatResponseChunk> | undefined; + + const closeStreams = (controller: ReadableStreamDefaultController) => { + controller.close(); + dataStream.close(); + }; + + const stream = new ReadableStream<EngineResponse>({ + async start(controller) { + // Kickstart the stream by sending an empty string + controller.enqueue({ delta: "" } as EngineResponse); + }, + async pull(controller) { + while (!generator) { + // get next event from workflow context + const { value: event, done } = + await context[Symbol.asyncIterator]().next(); + if (done) { + closeStreams(controller); + return; + } + generator = handleEvent(event, dataStream); + } + + const { value: chunk, done } = await generator.next(); + if (done) { + closeStreams(controller); + return; + } + const delta = chunk.delta ?? ""; + if (delta) { + controller.enqueue({ delta } as EngineResponse); + } + }, + }); + + return { stream, dataStream }; +} + +function handleEvent( + event: WorkflowEvent<unknown>, + dataStream: StreamData, +): AsyncGenerator<ChatResponseChunk> | undefined { + // Handle for StopEvent + if (event instanceof StopEvent) { + return event.data as AsyncGenerator<ChatResponseChunk>; + } + // Handle for AgentRunEvent + if (event instanceof AgentRunEvent) { + dataStream.appendMessageAnnotation({ + type: "agent", + data: event.data as JSONValue, + }); + } +} diff --git a/packages/server/src/workflow/tools.ts b/packages/server/src/workflow/tools.ts new file mode 100644 index 0000000000000000000000000000000000000000..4e46336616efb52bc9c94ada10ab72d1ce3cf2f1 --- /dev/null +++ b/packages/server/src/workflow/tools.ts @@ -0,0 +1,294 @@ +import { + type BaseToolWithCall, + callTool, + type ChatMessage, + type ChatResponse, + type ChatResponseChunk, + type HandlerContext, + type PartialToolCall, + type ToolCall, + ToolCallLLM, + type ToolCallLLMMessageOptions, +} from "llamaindex"; +import crypto from "node:crypto"; +import { AgentRunEvent } from "./type"; + +/** + * Call multiple tools and return the tool messages + */ +export const callTools = async <T>({ + tools, + toolCalls, + ctx, + agentName, + writeEvent = true, +}: { + toolCalls: ToolCall[]; + tools: BaseToolWithCall[]; + ctx: HandlerContext<T>; + agentName: string; + writeEvent?: boolean; +}): Promise<ChatMessage[]> => { + const toolMsgs: ChatMessage[] = []; + if (toolCalls.length === 0) { + return toolMsgs; + } + if (toolCalls.length === 1 && toolCalls[0]) { + const tool = tools.find( + (tool) => tool.metadata.name === toolCalls[0]!.name, + ); + if (!tool) { + throw new Error(`Tool ${toolCalls[0].name} not found`); + } + return [ + await callSingleTool( + tool, + toolCalls[0], + writeEvent + ? (msg: string) => { + ctx.sendEvent( + new AgentRunEvent({ + agent: agentName, + text: msg, + type: "text", + }), + ); + } + : undefined, + ), + ]; + } + // Multiple tool calls, show events in progress + const progressId = crypto.randomUUID(); + const totalSteps = toolCalls.length; + let currentStep = 0; + for (const toolCall of toolCalls) { + const tool = tools.find((tool) => tool.metadata.name === toolCall.name); + if (!tool) { + throw new Error(`Tool ${toolCall.name} not found`); + } + const toolMsg = await callSingleTool(tool, toolCall, (msg: string) => { + ctx.sendEvent( + new AgentRunEvent({ + agent: agentName, + text: msg, + type: "progress", + data: { + id: progressId, + total: totalSteps, + current: currentStep, + }, + }), + ); + currentStep++; + }); + toolMsgs.push(toolMsg); + } + return toolMsgs; +}; + +export const callSingleTool = async ( + tool: BaseToolWithCall, + toolCall: ToolCall, + eventEmitter?: (msg: string) => void, +): Promise<ChatMessage> => { + if (eventEmitter) { + eventEmitter( + `Calling tool ${toolCall.name} with input: ${JSON.stringify(toolCall.input)}`, + ); + } + + const toolOutput = await callTool(tool, toolCall, { + log: () => {}, + error: (...args: unknown[]) => { + console.error(`Tool ${toolCall.name} got error:`, ...args); + if (eventEmitter) { + eventEmitter(`Tool ${toolCall.name} got error: ${args.join(" ")}`); + } + return { + content: JSON.stringify({ + error: args.join(" "), + }), + role: "user", + options: { + toolResult: { + id: toolCall.id, + result: JSON.stringify({ + error: args.join(" "), + }), + isError: true, + }, + }, + }; + }, + warn: () => {}, + }); + + return { + content: JSON.stringify(toolOutput.output), + role: "user", + options: { + toolResult: { + result: toolOutput.output, + isError: toolOutput.isError, + id: toolCall.id, + }, + }, + }; +}; + +class ChatWithToolsResponse { + toolCalls: ToolCall[]; + toolCallMessage?: ChatMessage; + responseGenerator?: AsyncGenerator<ChatResponseChunk>; + + constructor(options: { + toolCalls: ToolCall[]; + toolCallMessage?: ChatMessage; + responseGenerator?: AsyncGenerator<ChatResponseChunk>; + }) { + this.toolCalls = options.toolCalls; + if (options.toolCallMessage) { + this.toolCallMessage = options.toolCallMessage; + } + if (options.responseGenerator) { + this.responseGenerator = options.responseGenerator; + } + } + + hasMultipleTools() { + const uniqueToolNames = new Set(this.getToolNames()); + return uniqueToolNames.size > 1; + } + + hasToolCall() { + return this.toolCalls.length > 0; + } + + getToolNames() { + return this.toolCalls.map((toolCall) => toolCall.name); + } + + async asFullResponse(): Promise<ChatMessage> { + if (!this.responseGenerator) { + throw new Error("No response generator"); + } + let fullResponse = ""; + for await (const chunk of this.responseGenerator) { + fullResponse += chunk.delta; + } + return { + role: "assistant", + content: fullResponse, + }; + } +} + +export const chatWithTools = async ( + llm: ToolCallLLM, + tools: BaseToolWithCall[], + messages: ChatMessage[], +): Promise<ChatWithToolsResponse> => { + const responseGenerator = async function* (): AsyncGenerator< + boolean | ChatResponseChunk, + void, + unknown + > { + const responseStream = await llm.chat({ messages, tools, stream: true }); + + let fullResponse = null; + let yieldedIndicator = false; + const toolCallMap = new Map(); + for await (const chunk of responseStream) { + const hasToolCalls = chunk.options && "toolCall" in chunk.options; + if (!hasToolCalls) { + if (!yieldedIndicator) { + yield false; + yieldedIndicator = true; + } + yield chunk; + } else if (!yieldedIndicator) { + yield true; + yieldedIndicator = true; + } + + if (chunk.options && "toolCall" in chunk.options) { + for (const toolCall of chunk.options.toolCall as PartialToolCall[]) { + if (toolCall.id) { + toolCallMap.set(toolCall.id, toolCall); + } + } + } + + if ( + hasToolCalls && + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (chunk.raw as any)?.choices?.[0]?.finish_reason !== null + ) { + // Update the fullResponse with the tool calls + const toolCalls = Array.from(toolCallMap.values()); + fullResponse = { + ...chunk, + options: { + ...chunk.options, + toolCall: toolCalls, + }, + }; + } + } + + if (fullResponse) { + yield fullResponse; + } + }; + + const generator = responseGenerator(); + const isToolCall = await generator.next(); + + if (isToolCall.value) { + // If it's a tool call, we need to wait for the full response + let fullResponse = null; + for await (const chunk of generator) { + fullResponse = chunk; + } + + if (fullResponse) { + const responseChunk = fullResponse as ChatResponseChunk; + const toolCalls = getToolCallsFromResponse(responseChunk); + return new ChatWithToolsResponse({ + toolCalls, + toolCallMessage: { + options: responseChunk.options, + role: "assistant", + content: "", + }, + }); + } else { + throw new Error("Cannot get tool calls from response"); + } + } + + return new ChatWithToolsResponse({ + toolCalls: [], + responseGenerator: generator as AsyncGenerator<ChatResponseChunk>, + }); +}; + +export const getToolCallsFromResponse = ( + response: + | ChatResponse<ToolCallLLMMessageOptions> + | ChatResponseChunk<ToolCallLLMMessageOptions>, +): ToolCall[] => { + let options; + + if ("message" in response) { + options = response.message.options; + } else { + options = response.options; + } + + if (options && "toolCall" in options) { + return options.toolCall as ToolCall[]; + } + return []; +}; diff --git a/packages/server/src/workflow/type.ts b/packages/server/src/workflow/type.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6141539f2fed04c2d78d13a826871d949b4331d --- /dev/null +++ b/packages/server/src/workflow/type.ts @@ -0,0 +1,30 @@ +import { + Workflow, + WorkflowEvent, + type ChatResponseChunk, + type MessageContent, +} from "llamaindex"; + +export type AgentInput = { + message: MessageContent; + streaming?: boolean; +}; + +export type AgentRunEventType = "text" | "progress"; + +export type ProgressEventData = { + id: string; + total: number; + current: number; +}; + +export type AgentRunEventData = ProgressEventData; + +export class AgentRunEvent extends WorkflowEvent<{ + agent: string; + text: string; + type: AgentRunEventType; + data?: AgentRunEventData; +}> {} + +export type ServerWorkflow = Workflow<null, AgentInput, ChatResponseChunk>; diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..a93775d954ab510bbae6d3aaabe2c7204f557e2b --- /dev/null +++ b/packages/server/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist/type", + "tsBuildInfoFile": "./dist/.tsbuildinfo", + "emitDeclarationOnly": true, + "moduleResolution": "Bundler", + "skipLibCheck": true, + "strict": true, + "types": ["node"] + }, + "include": ["./src"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fa0108c14cb5c6f7b466653021c360ca8204646..6cafdbf191d7bf1c7e12aa66f655a97067466a1d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1721,6 +1721,46 @@ importers: specifier: ^13.4.8 version: 13.4.8 + packages/server: + dependencies: + '@llamaindex/core': + specifier: workspace:* + version: link:../core + '@llamaindex/env': + specifier: workspace:* + version: link:../env + '@llamaindex/openai': + specifier: ^0.1.52 + version: link:../providers/openai + '@llamaindex/readers': + specifier: ^2.0.0 + version: link:../readers + '@llamaindex/tools': + specifier: workspace:* + version: link:../tools + ai: + specifier: ^4.0.3 + version: 4.1.34(react@19.0.0)(zod@3.24.2) + express: + specifier: ^4.18.2 + version: 4.21.2 + llamaindex: + specifier: workspace:* + version: link:../llamaindex + devDependencies: + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/node': + specifier: ^22.9.0 + version: 22.9.0 + bunchee: + specifier: 6.4.0 + version: 6.4.0(typescript@5.7.3) + vitest: + specifier: ^2.1.5 + version: 2.1.5(@edge-runtime/vm@4.0.4)(@types/node@22.9.0)(happy-dom@15.11.7)(lightningcss@1.29.1)(msw@2.7.0(@types/node@22.9.0)(typescript@5.7.3))(terser@5.38.2) + packages/tools: dependencies: '@apidevtools/swagger-parser': @@ -5406,9 +5446,15 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -5430,6 +5476,12 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/gensync@1.0.4': resolution: {integrity: sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==} @@ -5445,6 +5497,9 @@ packages: '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -5475,6 +5530,9 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -5511,6 +5569,12 @@ packages: '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@19.0.4': resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} peerDependencies: @@ -5528,6 +5592,12 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} @@ -5878,6 +5948,10 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -6070,6 +6144,9 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} @@ -6264,6 +6341,10 @@ packages: bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -6334,6 +6415,10 @@ packages: resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} engines: {node: '>= 0.8'} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@2.0.1: resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} peerDependencies: @@ -6661,10 +6746,17 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -6738,6 +6830,14 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -6827,6 +6927,10 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dependency-tree@11.1.1: resolution: {integrity: sha512-pnkCd8VGOq70EVaEQxDC9mZCjCwYj4yG4j8h+PEJswuWp+rdE6p8zbtVvWk+yPwaVimOjlhNi782U9K5KOU9MQ==} engines: {node: '>=18'} @@ -6839,6 +6943,10 @@ packages: destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -6975,6 +7083,9 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.5.97: resolution: {integrity: sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==} @@ -6997,6 +7108,14 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -7081,6 +7200,9 @@ packages: 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'} @@ -7306,6 +7428,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -7348,6 +7474,10 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} @@ -7452,6 +7582,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + find-chrome-bin@2.0.2: resolution: {integrity: sha512-KlggCilbbvgETk/WEq9NG894U8yu4erIW0SjMm1sMPm2xihCHeNoybpzGoxEzHRthwF3XrKOgHYtfqgJzpCH2w==} engines: {node: '>=18.0.0'} @@ -7542,6 +7676,10 @@ packages: resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} engines: {node: '>= 18'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + foxact@0.2.44: resolution: {integrity: sha512-+dBx0dXnfTDuYrDIDXYVeQw+Dw6YEDwyZwvmkycCuzP78rWfE7xBSzlEIX46ge14hD4DZ3i2tTEE3SoDTAVihA==} peerDependencies: @@ -7567,6 +7705,10 @@ packages: react-dom: optional: true + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -8038,6 +8180,10 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -8147,6 +8293,10 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-absolute-url@4.0.1: resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8966,6 +9116,9 @@ packages: memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-refs@1.3.0: resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} peerDependencies: @@ -8981,6 +9134,10 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + microdiff@1.5.0: resolution: {integrity: sha512-Drq+/THMvDdzRYrK0oxJmOKiC24ayUV8ahrt8l3oRK51PWt6gdtrIGrlIH3pT/lFh1z93FbAcidtsHcWbnRz8Q==} @@ -9398,6 +9555,9 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -9458,6 +9618,10 @@ packages: engines: {node: '>= 4.4.x'} hasBin: true + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -9660,6 +9824,10 @@ packages: ollama@0.5.13: resolution: {integrity: sha512-qK3eE2GjMYjCiTknEJfAHjbUzUqgVtf9qtzjxWrkwBZgBG7kOB6Z4+Ov4fbvDjmKKHv+rpuTsWFg4jZvVjNBtQ==} + 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==} @@ -9871,6 +10039,10 @@ packages: parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -9901,6 +10073,9 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -10270,6 +10445,10 @@ packages: resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-agent@6.4.0: resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} engines: {node: '>= 14'} @@ -10303,6 +10482,10 @@ packages: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -10328,6 +10511,10 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + ranges-apply@7.0.16: resolution: {integrity: sha512-4rGJHOyA7qatiMDg3vcETkc/TVBPU86/xZRTXff6o7a2neYLmj0EXUUAlhLVuiWAzTPHDPHOQxtk8EDrIF4ohg==} engines: {node: '>=14.18.0'} @@ -10344,6 +10531,10 @@ packages: resolution: {integrity: sha512-fhNEG0vGi7bESitNNqNBAfYPdl2efB+1paFlI8BQDCNkruERKuuhG8LkQClDIVqUJLkrmKuOSPQ3xZHqVnVo3Q==} engines: {node: '>=14.18.0'} + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + raw-loader@4.0.2: resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} engines: {node: '>= 10.13.0'} @@ -10843,9 +11034,17 @@ packages: engines: {node: '>=10'} hasBin: true + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -10867,6 +11066,9 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -11403,6 +11605,10 @@ packages: to-vfile@6.1.0: resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + token-types@6.0.0: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'} @@ -11727,6 +11933,10 @@ packages: unpdf@0.12.1: resolution: {integrity: sha512-ktP8+TTLDBrlu/j8rQVNbHoMMpFXzkVAkb1rt/JdshFC3jOHdZjuGCNl/voPL0kraUrUOH7ZC88kVxMvlvDBzA==} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + unplugin@1.16.1: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} @@ -11782,6 +11992,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -11799,6 +12013,10 @@ packages: engines: {node: '>=8'} hasBin: true + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vaul@0.9.9: resolution: {integrity: sha512-7afKg48srluhZwIkaU+lgGtFCUsYBSGOl8vcc8N/M3YQlZFlynHD15AE+pwrYdc826o7nrIND4lL9Y6b9WWZZQ==} peerDependencies: @@ -16468,8 +16686,17 @@ snapshots: dependencies: '@babel/types': 7.26.8 + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.9.0 + '@types/caseless@0.12.5': {} + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.9.0 + '@types/cookie@0.6.0': {} '@types/debug@4.1.12': @@ -16494,6 +16721,20 @@ snapshots: '@types/estree@1.0.6': {} + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.9.0 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.18 + '@types/serve-static': 1.15.7 + '@types/gensync@1.0.4': {} '@types/hast@2.3.10': @@ -16508,6 +16749,8 @@ snapshots: '@types/http-cache-semantics@4.0.4': {} + '@types/http-errors@2.0.4': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -16534,6 +16777,8 @@ snapshots: '@types/mdx@2.0.13': {} + '@types/mime@1.3.5': {} + '@types/ms@2.1.0': {} '@types/node-fetch@2.6.12': @@ -16582,6 +16827,10 @@ snapshots: '@types/prop-types@15.7.14': {} + '@types/qs@6.9.18': {} + + '@types/range-parser@1.2.7': {} + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: '@types/react': 19.0.10 @@ -16604,6 +16853,17 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.9.0 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.9.0 + '@types/send': 0.17.4 + '@types/statuses@2.0.5': {} '@types/tough-cookie@4.0.5': {} @@ -17135,6 +17395,11 @@ snapshots: dependencies: event-target-shim: 5.0.1 + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -17307,6 +17572,8 @@ snapshots: call-bound: 1.0.3 is-array-buffer: 3.0.5 + array-flatten@1.1.1: {} + array-includes@3.1.8: dependencies: call-bind: 1.0.8 @@ -17528,6 +17795,23 @@ snapshots: bluebird@3.4.7: {} + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + bowser@2.11.0: {} brace-expansion@1.1.11: @@ -17628,6 +17912,8 @@ snapshots: bytes-iec@3.1.1: {} + bytes@3.1.2: {} + c12@2.0.1: dependencies: chokidar: 4.0.3 @@ -17974,8 +18260,12 @@ snapshots: convert-source-map@2.0.0: {} + cookie-signature@1.0.6: {} + cookie@0.5.0: {} + cookie@0.7.1: {} + cookie@0.7.2: {} core-util-is@1.0.3: {} @@ -18040,6 +18330,10 @@ snapshots: dayjs@1.11.13: {} + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -18108,6 +18402,8 @@ snapshots: delegates@1.0.0: optional: true + depd@2.0.0: {} + dependency-tree@11.1.1: dependencies: commander: 12.1.0 @@ -18121,6 +18417,8 @@ snapshots: destr@2.0.3: {} + destroy@1.2.0: {} + detect-indent@6.1.0: {} detect-libc@1.0.3: {} @@ -18270,6 +18568,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + ee-first@1.1.1: {} + electron-to-chromium@1.5.97: {} emoji-regex-xs@1.0.0: {} @@ -18284,6 +18584,10 @@ snapshots: enabled@2.0.0: {} + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -18525,6 +18829,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -18998,6 +19304,8 @@ snapshots: esutils@2.0.3: {} + etag@1.8.1: {} + event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} @@ -19040,6 +19348,42 @@ snapshots: expect-type@1.1.0: {} + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + ext-list@2.2.2: dependencies: mime-db: 1.53.0 @@ -19166,6 +19510,18 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + find-chrome-bin@2.0.2: dependencies: '@puppeteer/browsers': 2.7.1 @@ -19256,6 +19612,8 @@ snapshots: formdata-node@6.0.3: {} + forwarded@0.2.0: {} + foxact@0.2.44(react@19.0.0): dependencies: client-only: 0.0.1 @@ -19274,6 +19632,8 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) + fresh@0.5.2: {} + fs-constants@1.0.0: {} fs-extra@7.0.1: @@ -20072,6 +20432,14 @@ snapshots: http-cache-semantics@4.1.1: {} + 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 + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 @@ -20200,6 +20568,8 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 + ipaddr.js@1.9.1: {} + is-absolute-url@4.0.1: {} is-alphabetical@2.0.1: {} @@ -21174,6 +21544,8 @@ snapshots: memory-pager@1.5.0: {} + merge-descriptors@1.0.3: {} + merge-refs@1.3.0(@types/react@19.0.10): optionalDependencies: '@types/react': 19.0.10 @@ -21182,6 +21554,8 @@ snapshots: merge2@1.4.1: {} + methods@1.1.2: {} + microdiff@1.5.0: {} micromark-core-commonmark@1.1.0: @@ -21858,6 +22232,8 @@ snapshots: mri@1.2.0: {} + ms@2.0.0: {} + ms@2.1.2: {} ms@2.1.3: {} @@ -21968,6 +22344,8 @@ snapshots: iconv-lite: 0.6.3 sax: 1.4.1 + negotiator@0.6.3: {} + negotiator@1.0.0: {} neo-async@2.6.2: {} @@ -22176,6 +22554,10 @@ snapshots: dependencies: whatwg-fetch: 3.6.20 + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -22450,6 +22832,8 @@ snapshots: leac: 0.6.0 peberminta: 0.9.0 + parseurl@1.3.3: {} + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -22472,6 +22856,8 @@ snapshots: lru-cache: 11.0.2 minipass: 7.1.2 + path-to-regexp@0.1.12: {} + path-to-regexp@6.3.0: {} path-type@4.0.0: {} @@ -22793,6 +23179,11 @@ snapshots: '@types/node': 22.9.0 long: 5.3.0 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-agent@6.4.0: dependencies: agent-base: 7.1.3 @@ -22851,6 +23242,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + qs@6.14.0: dependencies: side-channel: 1.1.0 @@ -22884,6 +23279,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + range-parser@1.2.1: {} + ranges-apply@7.0.16: dependencies: ranges-merge: 9.0.15 @@ -22903,6 +23300,13 @@ snapshots: ranges-sort@6.0.11: {} + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + raw-loader@4.0.2(webpack@5.97.1): dependencies: loader-utils: 2.0.4 @@ -23624,10 +24028,37 @@ snapshots: semver@7.7.1: {} + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + server-only@0.0.1: {} set-blocking@2.0.0: @@ -23657,6 +24088,8 @@ snapshots: setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} + sharp@0.32.6: dependencies: color: 4.2.3 @@ -24290,6 +24723,8 @@ snapshots: is-buffer: 2.0.5 vfile: 4.2.1 + toidentifier@1.0.1: {} + token-types@6.0.0: dependencies: '@tokenizer/token': 0.3.0 @@ -24668,6 +25103,8 @@ snapshots: - encoding - supports-color + unpipe@1.0.0: {} + unplugin@1.16.1: dependencies: acorn: 8.14.0 @@ -24717,6 +25154,8 @@ snapshots: util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + uuid@8.3.2: {} uuid@9.0.1: {} @@ -24730,6 +25169,8 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 + vary@1.1.2: {} + vaul@0.9.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@radix-ui/react-dialog': 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) diff --git a/tsconfig.json b/tsconfig.json index 9de0bcdbe5ea19a8e21337af06ea7568f895ac4d..4326a21209bfb258b0bbb04d155ce99c2ba2dd61 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -193,6 +193,9 @@ }, { "path": "./packages/tools/tsconfig.json" + }, + { + "path": "./packages/server/tsconfig.json" } ] }