From f6fbede09b9e626d42ee05a82770c18c44937a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Galv=C3=A3o?= Date: Wed, 25 Feb 2026 21:03:53 -0300 Subject: [PATCH 1/2] feat(server): add Agents SDK backend adapter --- README.md | 10 ++- apps/server/package.json | 1 + apps/server/src/index.ts | 37 ++++++++-- apps/server/src/services/openai-agents-llm.ts | 72 +++++++++++++++++++ 4 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 apps/server/src/services/openai-agents-llm.ts diff --git a/README.md b/README.md index bcd264a..52dce53 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,18 @@ data/ ```bash export OPENAI_API_KEY="sk-..." ``` -3. Start the integrated dev server (Express + embedded Vite middleware on one port): +3. (Optional) Choose the LLM backend implementation: + ```bash + export OPENAI_LLM_BACKEND="responses" # default + # or + export OPENAI_LLM_BACKEND="agents_sdk" + ``` +4. Start the integrated dev server (Express + embedded Vite middleware on one port): ```bash npm run dev ``` Open `http://localhost:3000` for the UI; APIs live under `/api`. -4. Production build: +5. Production build: ```bash npm run build ``` diff --git a/apps/server/package.json b/apps/server/package.json index 8c80ccf..5bc8b45 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -12,6 +12,7 @@ "test": "npm run typecheck" }, "dependencies": { + "@openai/agents": "^0.1.0", "@agentic/types": "file:../../packages/types", "@agentic/workflow-engine": "file:../../packages/workflow-engine", "cors": "^2.8.5", diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index a7a56ac..9aac7b9 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -8,12 +8,35 @@ import WorkflowEngine, { type WorkflowLLM } from '@agentic/workflow-engine'; import { config } from './config'; import { logger } from './logger'; import { createWorkflowRouter } from './routes/workflows'; +import { OpenAIAgentsLLMService } from './services/openai-agents-llm'; import { OpenAILLMService } from './services/openai-llm'; import { addWorkflow } from './store/active-workflows'; const isProduction = process.env.NODE_ENV === 'production'; const webRoot = path.resolve(__dirname, '../../web'); const webDist = path.join(webRoot, 'dist'); +const DEFAULT_OPENAI_BACKEND = 'responses'; + +type OpenAiBackend = 'responses' | 'agents_sdk'; + +function resolveOpenAiBackend(value: string | undefined): OpenAiBackend { + const normalized = (value ?? DEFAULT_OPENAI_BACKEND).trim().toLowerCase(); + + if (normalized === 'responses') { + return 'responses'; + } + + if (normalized === 'agents' || normalized === 'agents_sdk' || normalized === 'agents-sdk') { + return 'agents_sdk'; + } + + logger.warn( + 'Unsupported OPENAI_LLM_BACKEND "%s". Falling back to "%s".', + value, + DEFAULT_OPENAI_BACKEND + ); + return 'responses'; +} /** * On startup, scan the runs directory for persisted paused runs and re-hydrate @@ -69,11 +92,17 @@ async function bootstrap() { app.use(cors()); app.use(express.json({ limit: '1mb' })); - let llmService: OpenAILLMService | undefined; + const openAiBackend = resolveOpenAiBackend(process.env.OPENAI_LLM_BACKEND); + let llmService: WorkflowLLM | undefined; if (config.openAiApiKey) { - logger.info('OPENAI_API_KEY detected, enabling live OpenAI responses'); - const client = new OpenAI({ apiKey: config.openAiApiKey }); - llmService = new OpenAILLMService(client); + if (openAiBackend === 'agents_sdk') { + logger.info('OPENAI_API_KEY detected, enabling live OpenAI Agents SDK backend'); + llmService = new OpenAIAgentsLLMService(); + } else { + logger.info('OPENAI_API_KEY detected, enabling live OpenAI Responses API backend'); + const client = new OpenAI({ apiKey: config.openAiApiKey }); + llmService = new OpenAILLMService(client); + } } else { logger.warn('OPENAI_API_KEY missing. Agent workflows will be rejected.'); } diff --git a/apps/server/src/services/openai-agents-llm.ts b/apps/server/src/services/openai-agents-llm.ts new file mode 100644 index 0000000..f803f81 --- /dev/null +++ b/apps/server/src/services/openai-agents-llm.ts @@ -0,0 +1,72 @@ +import type { AgentInvocation, WorkflowLLM } from '@agentic/workflow-engine'; + +type AgentsSdkModule = { + Agent: new (config: Record) => unknown; + run: (agent: unknown, input: string) => Promise<{ finalOutput?: unknown }>; + webSearchTool: () => unknown; +}; + +let sdkModulePromise: Promise | null = null; + +async function loadAgentsSdk(): Promise { + if (!sdkModulePromise) { + sdkModulePromise = (new Function('moduleName', 'return import(moduleName);') as ( + moduleName: string + ) => Promise)('@openai/agents').catch((error: unknown) => { + sdkModulePromise = null; + const message = error instanceof Error ? error.message : String(error); + throw new Error( + `OpenAI Agents SDK backend selected but '@openai/agents' is unavailable: ${message}` + ); + }); + } + return sdkModulePromise; +} + +function buildAgentTools(invocation: AgentInvocation, sdk: AgentsSdkModule): unknown[] { + const tools: unknown[] = []; + + if (invocation.tools?.web_search) { + tools.push(sdk.webSearchTool()); + } + + return tools; +} + +function toTextOutput(finalOutput: unknown): string { + if (typeof finalOutput === 'string') { + return finalOutput.trim(); + } + if (finalOutput === undefined || finalOutput === null) { + return 'Model returned no text output.'; + } + return JSON.stringify(finalOutput); +} + +export class OpenAIAgentsLLMService implements WorkflowLLM { + async respond(invocation: AgentInvocation): Promise { + const sdk = await loadAgentsSdk(); + const tools = buildAgentTools(invocation, sdk); + const agentConfig: Record = { + name: 'Workflow Agent', + instructions: invocation.systemPrompt, + model: invocation.model + }; + + if (tools.length > 0) { + agentConfig.tools = tools; + } + + if (invocation.reasoningEffort) { + agentConfig.modelSettings = { + reasoning: { + effort: invocation.reasoningEffort + } + }; + } + + const agent = new sdk.Agent(agentConfig); + const result = await sdk.run(agent, invocation.userContent); + return toTextOutput(result.finalOutput); + } +} From 0b188dda546367cd5ecd1a1576cfd177ff79dcab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20Galv=C3=A3o?= Date: Thu, 26 Feb 2026 10:04:09 -0300 Subject: [PATCH 2/2] refactor(server): migrate to Agents SDK backend --- AGENTS.md | 3 +- CLAUDE.md | 3 + README.md | 12 +- apps/server/package.json | 3 +- apps/server/src/index.ts | 35 +- apps/server/src/services/openai-agents-llm.ts | 11 +- apps/server/src/services/openai-llm.ts | 73 -- package-lock.json | 838 +++++++++++++++++- 8 files changed, 826 insertions(+), 152 deletions(-) delete mode 100644 apps/server/src/services/openai-llm.ts diff --git a/AGENTS.md b/AGENTS.md index 512ff5c..6e4541e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -23,7 +23,7 @@ This repository is an npm workspace monorepo: - Language: TypeScript across apps/packages, with `strict` mode enabled. - Use `import type` where applicable (`@typescript-eslint/consistent-type-imports` is enforced). - Keep unused parameters/locals prefixed with `_` to satisfy lint rules. -- Match existing file naming patterns: kebab-case files (`openai-llm.ts`), PascalCase classes, UPPER_SNAKE_CASE constants. +- Match existing file naming patterns: kebab-case files (`openai-agents-llm.ts`), PascalCase classes, UPPER_SNAKE_CASE constants. - Follow existing indentation/style in each file; do not reformat unrelated code. ## Testing Guidelines @@ -46,3 +46,4 @@ This repository is an npm workspace monorepo: - Treat `design-system/` (git submodule) as the source of truth for UI primitives. - Prefer existing tokens/components from the submodule before building custom UI in `apps/web`. - If a needed component does not exist in `design-system/`, pause and consult the user before adding a new component or introducing a non-design-system alternative. +- In a brand new git worktree, initialize submodules before development (`git submodule update --init --recursive`), or the design-system assets will be missing. diff --git a/CLAUDE.md b/CLAUDE.md index 544d8ae..992f81f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -42,6 +42,8 @@ npm run build:packages # Build only shared packages (types + engine) **Approval/pause flow:** When engine hits an Approval node, it sets `waitingForInput=true` and the engine instance is stored in an in-memory `Map` (`store/active-workflows.ts`). Client calls `POST /api/resume` with user input to continue. +**Agent backend:** Server agent execution is implemented through OpenAI Agents SDK (`apps/server/src/services/openai-agents-llm.ts`). Agent runs are capped with `maxTurns: 20` to bound loop iterations. + **Build dependency chain:** `packages/types` → `packages/workflow-engine` → `apps/server` / `apps/web`. Always run `build:packages` before typechecking or building apps. ## Design System (Git Submodule) @@ -106,3 +108,4 @@ Agent node `userPrompt` fields support `{{PREVIOUS_OUTPUT}}` as a template token - `data/runs/` is gitignored — created automatically at runtime. - `.config/default-workflow.json` is gitignored — create it locally to preload a workflow on startup. - Clone with `--recurse-submodules` to pull the design-system submodule. +- In a brand new git worktree, run `git submodule update --init --recursive` before development so the design-system submodule is available. diff --git a/README.md b/README.md index 52dce53..73f582e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ data/ - **Visual Editor** – Canvas, floating palette, zoom controls, and inline node forms for prompts, branching rules, and approval copy. - **Run Console** – Chat-style panel that renders agent responses progressively as they arrive via SSE, with per-agent labels, spinner states, and approval requests. -- **Workflow Engine** – Handles graph traversal, approvals, and LLM invocation (OpenAI Responses API or mock). +- **Workflow Engine** – Handles graph traversal, approvals, and LLM invocation (OpenAI Agents SDK). - **Persistent Audit Trail** – Every run writes `data/runs/run_.json` containing the workflow graph plus raw execution logs, independent of what the UI chooses to display. ## Getting Started @@ -35,18 +35,12 @@ data/ ```bash export OPENAI_API_KEY="sk-..." ``` -3. (Optional) Choose the LLM backend implementation: - ```bash - export OPENAI_LLM_BACKEND="responses" # default - # or - export OPENAI_LLM_BACKEND="agents_sdk" - ``` -4. Start the integrated dev server (Express + embedded Vite middleware on one port): +3. Start the integrated dev server (Express + embedded Vite middleware on one port): ```bash npm run dev ``` Open `http://localhost:3000` for the UI; APIs live under `/api`. -5. Production build: +4. Production build: ```bash npm run build ``` diff --git a/apps/server/package.json b/apps/server/package.json index 5bc8b45..c44b9d5 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -16,8 +16,7 @@ "@agentic/types": "file:../../packages/types", "@agentic/workflow-engine": "file:../../packages/workflow-engine", "cors": "^2.8.5", - "express": "^4.19.2", - "openai": "^6.9.1" + "express": "^4.19.2" }, "devDependencies": { "@types/cors": "^2.8.17", diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index 9aac7b9..d13dca2 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -2,41 +2,17 @@ import fs from 'node:fs'; import path from 'node:path'; import express, { type Request, type Response } from 'express'; import cors from 'cors'; -import OpenAI from 'openai'; import type { WorkflowRunRecord } from '@agentic/types'; import WorkflowEngine, { type WorkflowLLM } from '@agentic/workflow-engine'; import { config } from './config'; import { logger } from './logger'; import { createWorkflowRouter } from './routes/workflows'; import { OpenAIAgentsLLMService } from './services/openai-agents-llm'; -import { OpenAILLMService } from './services/openai-llm'; import { addWorkflow } from './store/active-workflows'; const isProduction = process.env.NODE_ENV === 'production'; const webRoot = path.resolve(__dirname, '../../web'); const webDist = path.join(webRoot, 'dist'); -const DEFAULT_OPENAI_BACKEND = 'responses'; - -type OpenAiBackend = 'responses' | 'agents_sdk'; - -function resolveOpenAiBackend(value: string | undefined): OpenAiBackend { - const normalized = (value ?? DEFAULT_OPENAI_BACKEND).trim().toLowerCase(); - - if (normalized === 'responses') { - return 'responses'; - } - - if (normalized === 'agents' || normalized === 'agents_sdk' || normalized === 'agents-sdk') { - return 'agents_sdk'; - } - - logger.warn( - 'Unsupported OPENAI_LLM_BACKEND "%s". Falling back to "%s".', - value, - DEFAULT_OPENAI_BACKEND - ); - return 'responses'; -} /** * On startup, scan the runs directory for persisted paused runs and re-hydrate @@ -92,17 +68,10 @@ async function bootstrap() { app.use(cors()); app.use(express.json({ limit: '1mb' })); - const openAiBackend = resolveOpenAiBackend(process.env.OPENAI_LLM_BACKEND); let llmService: WorkflowLLM | undefined; if (config.openAiApiKey) { - if (openAiBackend === 'agents_sdk') { - logger.info('OPENAI_API_KEY detected, enabling live OpenAI Agents SDK backend'); - llmService = new OpenAIAgentsLLMService(); - } else { - logger.info('OPENAI_API_KEY detected, enabling live OpenAI Responses API backend'); - const client = new OpenAI({ apiKey: config.openAiApiKey }); - llmService = new OpenAILLMService(client); - } + logger.info('OPENAI_API_KEY detected, enabling live OpenAI Agents SDK backend'); + llmService = new OpenAIAgentsLLMService(); } else { logger.warn('OPENAI_API_KEY missing. Agent workflows will be rejected.'); } diff --git a/apps/server/src/services/openai-agents-llm.ts b/apps/server/src/services/openai-agents-llm.ts index f803f81..37f02bc 100644 --- a/apps/server/src/services/openai-agents-llm.ts +++ b/apps/server/src/services/openai-agents-llm.ts @@ -2,11 +2,16 @@ import type { AgentInvocation, WorkflowLLM } from '@agentic/workflow-engine'; type AgentsSdkModule = { Agent: new (config: Record) => unknown; - run: (agent: unknown, input: string) => Promise<{ finalOutput?: unknown }>; + run: ( + agent: unknown, + input: string, + options?: { maxTurns?: number } + ) => Promise<{ finalOutput?: unknown }>; webSearchTool: () => unknown; }; let sdkModulePromise: Promise | null = null; +const MAX_AGENT_TURNS = 20; async function loadAgentsSdk(): Promise { if (!sdkModulePromise) { @@ -16,7 +21,7 @@ async function loadAgentsSdk(): Promise { sdkModulePromise = null; const message = error instanceof Error ? error.message : String(error); throw new Error( - `OpenAI Agents SDK backend selected but '@openai/agents' is unavailable: ${message}` + `OpenAI Agents SDK is required but '@openai/agents' is unavailable: ${message}` ); }); } @@ -66,7 +71,7 @@ export class OpenAIAgentsLLMService implements WorkflowLLM { } const agent = new sdk.Agent(agentConfig); - const result = await sdk.run(agent, invocation.userContent); + const result = await sdk.run(agent, invocation.userContent, { maxTurns: MAX_AGENT_TURNS }); return toTextOutput(result.finalOutput); } } diff --git a/apps/server/src/services/openai-llm.ts b/apps/server/src/services/openai-llm.ts deleted file mode 100644 index bba7af8..0000000 --- a/apps/server/src/services/openai-llm.ts +++ /dev/null @@ -1,73 +0,0 @@ -import type OpenAI from 'openai'; -import type { AgentInvocation, WorkflowLLM } from '@agentic/workflow-engine'; - -function formatInput(invocation: AgentInvocation) { - return [ - { - role: 'system', - content: [ - { - type: 'input_text', - text: invocation.systemPrompt - } - ] - }, - { - role: 'user', - content: [ - { - type: 'input_text', - text: invocation.userContent - } - ] - } - ]; -} - -function extractText(response: any): string { - if (Array.isArray(response.output_text) && response.output_text.length > 0) { - return response.output_text.join('\n').trim(); - } - - if (Array.isArray(response.output)) { - const chunks: string[] = []; - response.output.forEach((entry: any) => { - if (entry.type === 'message' && Array.isArray(entry.content)) { - entry.content.forEach((chunk: any) => { - if (chunk.type === 'output_text' && chunk.text) { - chunks.push(chunk.text); - } - }); - } - }); - if (chunks.length > 0) { - return chunks.join('\n').trim(); - } - } - - return 'Model returned no text output.'; -} - -export class OpenAILLMService implements WorkflowLLM { - constructor(private readonly client: OpenAI) {} - - async respond(invocation: AgentInvocation): Promise { - const params: Record = { - model: invocation.model, - input: formatInput(invocation) - }; - - if (invocation.reasoningEffort) { - params.reasoning = { effort: invocation.reasoningEffort }; - } - - if (invocation.tools?.web_search) { - params.tools = [{ type: 'web_search' }]; - params.tool_choice = 'auto'; - } - - const response = await this.client.responses.create(params); - return extractText(response); - } -} - diff --git a/package-lock.json b/package-lock.json index f0acb14..672a5ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,9 +27,9 @@ "dependencies": { "@agentic/types": "file:../../packages/types", "@agentic/workflow-engine": "file:../../packages/workflow-engine", + "@openai/agents": "^0.1.0", "cors": "^2.8.5", - "express": "^4.19.2", - "openai": "^6.9.1" + "express": "^4.19.2" }, "devDependencies": { "@types/cors": "^2.8.17", @@ -696,6 +696,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -755,6 +768,412 @@ "dev": true, "license": "MIT" }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz", + "integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "optional": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "optional": true, + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "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.0", + "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.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "optional": true + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "optional": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "optional": true, + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "optional": true, + "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.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "optional": true, + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "optional": true, + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -793,6 +1212,135 @@ "node": ">= 8" } }, + "node_modules/@openai/agents": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@openai/agents/-/agents-0.1.11.tgz", + "integrity": "sha512-jnaFt54iP71vYDXvpG3EGX2kVRYIU2xBdCT3uFqdXm4KqFAP9JQFNGiKKBEeE5rbXARpqAQpKH+5HfoANndpcQ==", + "license": "MIT", + "dependencies": { + "@openai/agents-core": "0.1.11", + "@openai/agents-openai": "0.1.11", + "@openai/agents-realtime": "0.1.11", + "debug": "^4.4.0", + "openai": "^5.20.2" + }, + "peerDependencies": { + "zod": "^3.25.40" + } + }, + "node_modules/@openai/agents-core": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@openai/agents-core/-/agents-core-0.1.11.tgz", + "integrity": "sha512-ye8VIAO2wPIg1zClldIj8We/1R55VmdgnMyn0g4YGbp6RD5Wpv9yfH5kPNWxmHvw8ji+XehyggGoklY4FGQoBQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "openai": "^5.20.2" + }, + "optionalDependencies": { + "@modelcontextprotocol/sdk": "^1.17.2" + }, + "peerDependencies": { + "zod": "^3.25.40" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@openai/agents-core/node_modules/openai": { + "version": "5.23.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.23.2.tgz", + "integrity": "sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@openai/agents-openai": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@openai/agents-openai/-/agents-openai-0.1.11.tgz", + "integrity": "sha512-TYYbY7o1cNxtOIO4F1a20qkqDT1Iwr9ZEi0MO2sEaeioK8rGB/Ux54iFvsA3IblUYyK+5fD25vr4vXFasvg2Kg==", + "license": "MIT", + "dependencies": { + "@openai/agents-core": "0.1.11", + "debug": "^4.4.0", + "openai": "^5.20.2" + }, + "peerDependencies": { + "zod": "^3.25.40" + } + }, + "node_modules/@openai/agents-openai/node_modules/openai": { + "version": "5.23.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.23.2.tgz", + "integrity": "sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@openai/agents-realtime": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@openai/agents-realtime/-/agents-realtime-0.1.11.tgz", + "integrity": "sha512-8jaNuYU1acra28i7bYrZIPubI6s2ziY2ZudqAVK2ad+giopXcrNSiJTuZ2S3z+ESnIejwMiYLfnY2Le8W0SJ7A==", + "license": "MIT", + "dependencies": { + "@openai/agents-core": "0.1.11", + "@types/ws": "^8.18.1", + "debug": "^4.4.0", + "ws": "^8.18.1" + }, + "peerDependencies": { + "zod": "^3.25.40" + } + }, + "node_modules/@openai/agents/node_modules/openai": { + "version": "5.23.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-5.23.2.tgz", + "integrity": "sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.53.3", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", @@ -1190,7 +1738,6 @@ "version": "22.19.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -1243,6 +1790,15 @@ "@types/node": "*" } }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.47.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", @@ -1646,6 +2202,48 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT", + "optional": true + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1999,7 +2597,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2014,7 +2612,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2442,6 +3039,29 @@ "node": ">= 0.6" } }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "optional": true, + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/expect-type": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", @@ -2457,6 +3077,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -2498,6 +3119,25 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", + "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", + "license": "MIT", + "optional": true, + "dependencies": { + "ip-address": "10.0.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2517,7 +3157,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/fast-glob": { @@ -2564,6 +3204,23 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "optional": true + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -2923,6 +3580,16 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2975,13 +3642,30 @@ "node": ">=0.12.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT", + "optional": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, + "devOptional": true, "license": "ISC" }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -3009,6 +3693,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause", + "optional": true + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -3263,25 +3954,14 @@ "node": ">= 0.8" } }, - "node_modules/openai": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.9.1.tgz", - "integrity": "sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==", - "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "optional": true, + "dependencies": { + "wrappy": "1" } }, "node_modules/optionator": { @@ -3370,7 +4050,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -3419,6 +4099,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -3551,6 +4241,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3624,6 +4324,34 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "optional": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3770,7 +4498,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3783,7 +4511,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -4132,7 +4860,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unpipe": { @@ -4756,7 +5483,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4813,6 +5540,35 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC", + "optional": true + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "peer": true, + "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 + } + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4865,6 +5621,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "optional": true, + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, "packages/types": { "name": "@agentic/types", "version": "1.0.0",