diff --git a/agent-docs/src/agents/agent-pulse/context/builder.ts b/agent-docs/src/agents/agent-pulse/context/builder.ts index ca48a4f1..696c19c9 100644 --- a/agent-docs/src/agents/agent-pulse/context/builder.ts +++ b/agent-docs/src/agents/agent-pulse/context/builder.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from "@agentuity/sdk"; +type AgentContext = any; export async function buildSystemPrompt(tutorialContext: string, ctx: AgentContext): Promise { try { @@ -51,4 +51,4 @@ Stream your reasoning steps clearly.`; ctx.logger.error("Failed to build system prompt: %s", error instanceof Error ? error.message : String(error)); throw error; // Re-throw for centralized handling } -} \ No newline at end of file +} \ No newline at end of file diff --git a/agent-docs/src/agents/agent-pulse/index.ts b/agent-docs/src/agents/agent-pulse/index.ts index 5932c5fc..5f221762 100644 --- a/agent-docs/src/agents/agent-pulse/index.ts +++ b/agent-docs/src/agents/agent-pulse/index.ts @@ -1,4 +1,6 @@ -import type { AgentRequest, AgentResponse, AgentContext } from "@agentuity/sdk"; +type AgentRequest = any; +type AgentResponse = any; +type AgentContext = any; import { streamText } from "ai"; import { openai } from "@ai-sdk/openai"; import { createTools } from "./tools"; @@ -119,7 +121,6 @@ export default async function Agent( content: msg.content, })), tools, - maxSteps: 3, system: systemPrompt, }); diff --git a/agent-docs/src/agents/agent-pulse/request/parser.ts b/agent-docs/src/agents/agent-pulse/request/parser.ts index 91c5b254..b086c7b1 100644 --- a/agent-docs/src/agents/agent-pulse/request/parser.ts +++ b/agent-docs/src/agents/agent-pulse/request/parser.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from "@agentuity/sdk"; +type AgentContext = any; import type { ParsedAgentRequest } from "./types"; export function parseAgentRequest( diff --git a/agent-docs/src/agents/agent-pulse/state/manager.ts b/agent-docs/src/agents/agent-pulse/state/manager.ts index 00c1c570..71466797 100644 --- a/agent-docs/src/agents/agent-pulse/state/manager.ts +++ b/agent-docs/src/agents/agent-pulse/state/manager.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from "@agentuity/sdk"; +type AgentContext = any; import { ActionType, type AgentState } from "../state"; import { getTutorialStep } from "../tutorial"; import type { TutorialData } from "../streaming/types"; @@ -51,4 +51,4 @@ export async function handleTutorialState( ctx.logger.error("Failed to handle tutorial state: %s", error instanceof Error ? error.message : String(error)); throw error; // Re-throw for centralized handling } -} \ No newline at end of file +} \ No newline at end of file diff --git a/agent-docs/src/agents/agent-pulse/streaming/processor.ts b/agent-docs/src/agents/agent-pulse/streaming/processor.ts index 72f89019..f97387e5 100644 --- a/agent-docs/src/agents/agent-pulse/streaming/processor.ts +++ b/agent-docs/src/agents/agent-pulse/streaming/processor.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from "@agentuity/sdk"; +type AgentContext = any; import type { AgentState } from "../state"; import type { StreamingChunk, TutorialData } from "./types"; import { handleTutorialState } from "../state/manager"; diff --git a/agent-docs/src/agents/agent-pulse/tools.ts b/agent-docs/src/agents/agent-pulse/tools.ts index a53b20d5..ee8654f9 100644 --- a/agent-docs/src/agents/agent-pulse/tools.ts +++ b/agent-docs/src/agents/agent-pulse/tools.ts @@ -2,7 +2,7 @@ import { tool } from "ai"; import { z } from "zod"; import { ActionType } from "./state"; import type { AgentState } from "./state"; -import type { AgentContext } from "@agentuity/sdk"; +type AgentContext = any; import { getTutorialMeta } from "./tutorial"; /** @@ -25,11 +25,12 @@ export async function createTools(context: ToolContext) { */ const startTutorialAtStep = tool({ description: "Start a specific tutorial for the user. You must call this function in order for the user to see the tutorial step content. The step number should be between 1 and the total number of steps in the tutorial.", - parameters: z.object({ + inputSchema: z.object({ tutorialId: z.string().describe("The exact ID of the tutorial to start"), stepNumber: z.number().describe("The step number of the tutorial to start (1 to total available steps in the tutorial)") }), - execute: async ({ tutorialId, stepNumber }) => { + execute: async (input: any, options: any) => { + const { tutorialId, stepNumber } = input; // Validate tutorial exists before starting const tutorialResponse = await getTutorialMeta(tutorialId, agentContext); if (!tutorialResponse.success || !tutorialResponse.data) { @@ -58,10 +59,11 @@ export async function createTools(context: ToolContext) { */ const askDocsAgentTool = tool({ description: "Query the Agentuity Development Documentation agent using RAG (Retrieval Augmented Generation) to get relevant documentation and answers about the Agentuity platform, APIs, and development concepts", - parameters: z.object({ + inputSchema: z.object({ query: z.string().describe("The question or query to send to the query function"), }), - execute: async ({ query }) => { + execute: async (input: any, options: any) => { + const { query } = input; agentContext.logger.info("Querying agent %s with: %s", DOC_QA_AGENT_NAME, query); const agentPayload = { message: query, @@ -82,10 +84,11 @@ export async function createTools(context: ToolContext) { */ const fetchCodeExecutionResultTool = tool({ description: "Fetch code execution results from the frontend", - parameters: z.object({ + inputSchema: z.object({ executionId: z.string().describe("The ID of the code execution"), }), - execute: async ({ executionId }) => { + execute: async (input: any, options: any) => { + const { executionId } = input; agentContext.logger.info("Fetching execution result for: %s", executionId); // This would actually fetch execution results // For now, just return a mock response @@ -100,4 +103,4 @@ export async function createTools(context: ToolContext) { }; } -export type { ToolContext }; \ No newline at end of file +export type { ToolContext }; \ No newline at end of file diff --git a/agent-docs/src/agents/agent-pulse/tutorial.ts b/agent-docs/src/agents/agent-pulse/tutorial.ts index c5a00ed1..2473e7d9 100644 --- a/agent-docs/src/agents/agent-pulse/tutorial.ts +++ b/agent-docs/src/agents/agent-pulse/tutorial.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from '@agentuity/sdk'; +type AgentContext = any; const TUTORIAL_API_BASE_URL = process.env.TUTORIAL_API_URL; @@ -95,4 +95,4 @@ export async function getTutorialStep(tutorialId: string, stepNumber: number, ct ctx.logger.error('Error fetching tutorial step %d for tutorial %s: %s', stepNumber, tutorialId, error); throw error; } -} \ No newline at end of file +} diff --git a/agent-docs/src/agents/doc-processing/docs-orchestrator.ts b/agent-docs/src/agents/doc-processing/docs-orchestrator.ts index 4a235f1a..dd928903 100644 --- a/agent-docs/src/agents/doc-processing/docs-orchestrator.ts +++ b/agent-docs/src/agents/doc-processing/docs-orchestrator.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from '@agentuity/sdk'; +type AgentContext = any; import { VECTOR_STORE_NAME } from '../../../config'; import { processDoc } from './docs-processor'; import type { SyncPayload, SyncStats } from './types'; diff --git a/agent-docs/src/agents/doc-processing/docs-processor.ts b/agent-docs/src/agents/doc-processing/docs-processor.ts index cdffb47a..27a4642d 100644 --- a/agent-docs/src/agents/doc-processing/docs-processor.ts +++ b/agent-docs/src/agents/doc-processing/docs-processor.ts @@ -1,4 +1,4 @@ -import type { VectorUpsertParams } from '@agentuity/sdk'; +type VectorUpsertParams = any; import type { Chunk } from './chunk-mdx'; import { chunkAndEnrichDoc } from './chunk-mdx'; import { embedChunks } from './embed-chunks'; diff --git a/agent-docs/src/agents/doc-processing/index.ts b/agent-docs/src/agents/doc-processing/index.ts index a2435a1a..8f0dc047 100644 --- a/agent-docs/src/agents/doc-processing/index.ts +++ b/agent-docs/src/agents/doc-processing/index.ts @@ -1,4 +1,6 @@ -import type { AgentContext, AgentRequest, AgentResponse } from '@agentuity/sdk'; +type AgentContext = any; +type AgentRequest = any; +type AgentResponse = any; import { syncDocsFromPayload } from './docs-orchestrator'; import type { SyncPayload } from './types'; diff --git a/agent-docs/src/agents/doc-qa/index.ts b/agent-docs/src/agents/doc-qa/index.ts index 0d26e092..ecde4bd1 100644 --- a/agent-docs/src/agents/doc-qa/index.ts +++ b/agent-docs/src/agents/doc-qa/index.ts @@ -1,4 +1,6 @@ -import type { AgentContext, AgentRequest, AgentResponse } from '@agentuity/sdk'; +type AgentContext = any; +type AgentRequest = any; +type AgentResponse = any; import answerQuestion from './rag'; export default async function Agent( diff --git a/agent-docs/src/agents/doc-qa/prompt.ts b/agent-docs/src/agents/doc-qa/prompt.ts index 24aa5f01..f6393475 100644 --- a/agent-docs/src/agents/doc-qa/prompt.ts +++ b/agent-docs/src/agents/doc-qa/prompt.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from '@agentuity/sdk'; +type AgentContext = any; import { openai } from '@ai-sdk/openai'; import { generateObject, generateText } from 'ai'; diff --git a/agent-docs/src/agents/doc-qa/rag.ts b/agent-docs/src/agents/doc-qa/rag.ts index 5e13215e..e49a0c57 100644 --- a/agent-docs/src/agents/doc-qa/rag.ts +++ b/agent-docs/src/agents/doc-qa/rag.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from '@agentuity/sdk'; +type AgentContext = any; import { openai } from '@ai-sdk/openai'; import { generateObject } from 'ai'; import { rephraseVaguePrompt } from './prompt'; diff --git a/agent-docs/src/agents/doc-qa/retriever.ts b/agent-docs/src/agents/doc-qa/retriever.ts index b63922d3..f38676a6 100644 --- a/agent-docs/src/agents/doc-qa/retriever.ts +++ b/agent-docs/src/agents/doc-qa/retriever.ts @@ -1,4 +1,4 @@ -import type { AgentContext } from '@agentuity/sdk'; +type AgentContext = any; import { VECTOR_STORE_NAME, vectorSearchNumber } from '../../../config'; import type { RelevantDoc } from './types'; diff --git a/app/api/sessions/[sessionId]/messages/route.ts b/app/api/sessions/[sessionId]/messages/route.ts index 523b43d1..2b52b67d 100644 --- a/app/api/sessions/[sessionId]/messages/route.ts +++ b/app/api/sessions/[sessionId]/messages/route.ts @@ -220,9 +220,14 @@ export async function POST( const agentConfig = getAgentPulseConfig(); const agentUrl = agentConfig.url; - // Get current tutorial state for the user - const { TutorialStateManager } = await import('@/lib/tutorial/state-manager'); - const currentTutorialState = await TutorialStateManager.getCurrentTutorialState(userId); + // Get current tutorial state for the user (conditional loading) + const { canLoadAgentCode } = await import('@/lib/env-detection'); + let currentTutorialState = null; + + if (canLoadAgentCode()) { + const { TutorialStateManager } = await import('@/lib/tutorial/state-manager'); + currentTutorialState = await TutorialStateManager.getCurrentTutorialState(userId); + } const agentPayload = { message: message.content, @@ -275,13 +280,17 @@ export async function POST( } else if (data.type === "tutorial-data" && data.tutorialData) { finalTutorialData = data.tutorialData; - // Update user's tutorial progress - await TutorialStateManager.updateTutorialProgress( - userId, - finalTutorialData.tutorialId, - finalTutorialData.currentStep, - finalTutorialData.totalSteps - ); + // Update user's tutorial progress (conditional loading) + const { canLoadAgentCode } = await import('@/lib/env-detection'); + if (canLoadAgentCode()) { + const { TutorialStateManager } = await import('@/lib/tutorial/state-manager'); + await TutorialStateManager.updateTutorialProgress( + userId, + finalTutorialData.tutorialId, + finalTutorialData.currentStep, + finalTutorialData.totalSteps + ); + } } else if (data.type === "finish") { // When the stream is finished, save the assistant message const assistantMessage: Message = { diff --git a/app/api/users/tutorial-state/route.ts b/app/api/users/tutorial-state/route.ts index 70557fa7..19f929f3 100644 --- a/app/api/users/tutorial-state/route.ts +++ b/app/api/users/tutorial-state/route.ts @@ -1,5 +1,4 @@ import { NextRequest, NextResponse } from 'next/server'; -import { TutorialStateManager } from '@/lib/tutorial/state-manager'; import { setKVValue } from '@/lib/kv-store'; import { config } from '@/lib/config'; import { @@ -18,6 +17,12 @@ export async function GET(request: NextRequest) { return NextResponse.json({ error: 'User ID not found' }, { status: 401 }); } + const { canLoadAgentCode } = await import('@/lib/env-detection'); + if (!canLoadAgentCode()) { + return NextResponse.json({ error: 'Tutorial state not available in this environment' }, { status: 503 }); + } + + const { TutorialStateManager } = await import('@/lib/tutorial/state-manager'); const tutorialState = await TutorialStateManager.getUserTutorialState(userId); return NextResponse.json({ @@ -50,6 +55,12 @@ export async function POST(request: NextRequest) { const { tutorialId, currentStep, totalSteps } = validation.data; + const { canLoadAgentCode } = await import('@/lib/env-detection'); + if (!canLoadAgentCode()) { + return NextResponse.json({ error: 'Tutorial state not available in this environment' }, { status: 503 }); + } + + const { TutorialStateManager } = await import('@/lib/tutorial/state-manager'); await TutorialStateManager.updateTutorialProgress( userId, tutorialId, @@ -87,6 +98,12 @@ export async function DELETE(request: NextRequest) { const { tutorialId } = validation.data; + const { canLoadAgentCode } = await import('@/lib/env-detection'); + if (!canLoadAgentCode()) { + return NextResponse.json({ error: 'Tutorial state not available in this environment' }, { status: 503 }); + } + + const { TutorialStateManager } = await import('@/lib/tutorial/state-manager'); const state = await TutorialStateManager.getUserTutorialState(userId); if (!state.tutorials) { state.tutorials = {}; diff --git a/lib/agent-loader.ts b/lib/agent-loader.ts new file mode 100644 index 00000000..84840cde --- /dev/null +++ b/lib/agent-loader.ts @@ -0,0 +1,26 @@ +import { canLoadAgentCode } from './env-detection'; + +/** + * Conditionally load agent-docs code only in Node.js environments + * This prevents OpenTelemetry auto-instrumentations from loading in Cloudflare Workers + */ +export async function loadAgentCode() { + if (!canLoadAgentCode()) { + throw new Error('Agent code cannot be loaded in this environment'); + } + + try { + const agentModule = await import('../agent-docs/src/agents/agent-pulse/index'); + return agentModule.default; + } catch (error) { + const stubModule = await import('./agent-stub'); + return stubModule.default; + } +} + +/** + * Check if agent code can be loaded in the current environment + */ +export function isAgentCodeAvailable(): boolean { + return canLoadAgentCode(); +} diff --git a/lib/agent-stub.ts b/lib/agent-stub.ts new file mode 100644 index 00000000..d40f2231 --- /dev/null +++ b/lib/agent-stub.ts @@ -0,0 +1,12 @@ +/** + * Stub implementation for agent functionality during build time + * This prevents loading of @agentuity/sdk and related dependencies + */ + +export default function AgentStub() { + throw new Error('Agent functionality not available in this environment'); +} + +export const createTools = () => { + throw new Error('Agent tools not available in this environment'); +}; diff --git a/lib/env-detection.ts b/lib/env-detection.ts new file mode 100644 index 00000000..e703e5cb --- /dev/null +++ b/lib/env-detection.ts @@ -0,0 +1,17 @@ +/** + * Detect if we're running in a Cloudflare Workers environment + */ +export function isCloudflareWorkers(): boolean { + return typeof (globalThis as any).caches !== 'undefined' && + typeof (globalThis as any).EdgeRuntime !== 'undefined' || + typeof process === 'undefined' || + (typeof process !== 'undefined' && process.env?.CF_PAGES === '1') || + (typeof process !== 'undefined' && process.env?.CLOUDFLARE_ENV !== undefined); +} + +/** + * Detect if we're running in a Node.js environment where agent code can be loaded + */ +export function canLoadAgentCode(): boolean { + return !isCloudflareWorkers() && typeof process !== 'undefined'; +} diff --git a/next.config.mjs b/next.config.mjs index 5c5c9c75..65872509 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -19,6 +19,16 @@ const config = { permanent: true, }, ], + webpack: (config, { isServer }) => { + // Exclude agent-docs directory from webpack compilation to prevent + // OpenTelemetry auto-instrumentations from loading in Cloudflare Workers + config.module.rules.push({ + test: /agent-docs/, + use: 'ignore-loader', + }); + + return config; + }, }; export default withMDX(config); diff --git a/package-lock.json b/package-lock.json index 6af53dfa..7c060f71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,11 @@ "version": "1.0.0", "hasInstallScript": true, "dependencies": { + "@ai-sdk/openai": "^2.0.31", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-visually-hidden": "^1.2.3", "@types/uuid": "^10.0.0", + "ai": "^5.0.45", "allotment": "^1.20.4", "fumadocs-core": "15.2.6", "fumadocs-mdx": "11.5.8", @@ -31,7 +33,7 @@ "swr": "^2.3.6", "twoslash": "^0.3.1", "uuid": "^11.1.0", - "zod": "^4.1.8" + "zod": "^4.1.9" }, "devDependencies": { "@biomejs/biome": "2.1.2", @@ -41,6 +43,7 @@ "@types/node": "22.10.9", "@types/react": "^19.0.7", "@types/react-dom": "^19.0.3", + "ignore-loader": "^0.1.2", "postcss": "^8.5.1", "tailwindcss": "^4.0.0", "ts-node": "^10.9.2", @@ -48,6 +51,67 @@ "wrangler": "^4.10.0" } }, + "node_modules/@ai-sdk/gateway": { + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.23.tgz", + "integrity": "sha512-ynV7WxpRK2zWLGkdOtrU2hW22mBVkEYVS3iMg1+ZGmAYSgzCqzC74bfOJZ2GU1UdcrFWUsFI9qAYjsPkd+AebA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.31.tgz", + "integrity": "sha512-3aWsUk5lcHLkr8T29xj+MCAoK6Vmi0umrfIryE0oiz7X54n0EZjB4l6AJOmua+OO5tgP7x9C24rPrNnBzGiw+Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.9.tgz", + "integrity": "sha512-Pm571x5efqaI4hf9yW4KsVlDBDme8++UepZRnq+kqVBWWjgvGhQlzU8glaFq0YJEB9kkxZHbRRyVeHoV2sRYaQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -9844,6 +9908,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@orama/orama": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/@orama/orama/-/orama-3.1.10.tgz", @@ -12775,7 +12848,8 @@ "node_modules/@types/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==" + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" }, "node_modules/@typescript/vfs": { "version": "1.6.1", @@ -12825,10 +12899,29 @@ "node": ">=0.4.0" } }, + "node_modules/ai": { + "version": "5.0.45", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.45.tgz", + "integrity": "sha512-go6J78B1oTXZMN2XLlNJnrFxwcqXQtpPqUVyk1wvzvpb2dk5nP9yNuxqqOX9HrrKuf5U9M6rSezEJWr1eEG9RA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "1.0.23", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.9", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, "node_modules/allotment": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/allotment/-/allotment-1.20.4.tgz", "integrity": "sha512-LMM5Xe5nLePFOLAlW/5k3ARqznYGUyNekV4xJrfDKn1jimW3nlZE6hT/Tu0T8s0VgAkr9s2P7+uM0WvJKn5DAw==", + "license": "MIT", "dependencies": { "classnames": "^2.3.0", "eventemitter3": "^5.0.0", @@ -14292,6 +14385,15 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, + "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", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -15099,6 +15201,12 @@ "node": ">= 4" } }, + "node_modules/ignore-loader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", + "integrity": "sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA==", + "dev": true + }, "node_modules/image-size": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", @@ -15305,6 +15413,12 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/katex": { "version": "0.16.22", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", @@ -17181,6 +17295,7 @@ "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz", "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "nan": "^2.17.0" } @@ -18876,6 +18991,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "license": "MIT", "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" @@ -19305,6 +19421,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/esm/bin/uuid" } @@ -19614,9 +19731,9 @@ } }, "node_modules/zod": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.8.tgz", - "integrity": "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.9.tgz", + "integrity": "sha512-HI32jTq0AUAC125z30E8bQNz0RQ+9Uc+4J7V97gLYjZVKRjeydPgGt6dvQzFrav7MYOUGFqqOGiHpA/fdbd0cQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 38f907ee..602775a5 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,11 @@ "validate-env": "node -e \"require('./lib/env').validateEnv()\"" }, "dependencies": { + "@ai-sdk/openai": "^2.0.31", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-visually-hidden": "^1.2.3", "@types/uuid": "^10.0.0", + "ai": "^5.0.45", "allotment": "^1.20.4", "fumadocs-core": "15.2.6", "fumadocs-mdx": "11.5.8", @@ -43,7 +45,7 @@ "swr": "^2.3.6", "twoslash": "^0.3.1", "uuid": "^11.1.0", - "zod": "^4.1.8" + "zod": "^4.1.9" }, "devDependencies": { "@biomejs/biome": "2.1.2", @@ -53,6 +55,7 @@ "@types/node": "22.10.9", "@types/react": "^19.0.7", "@types/react-dom": "^19.0.3", + "ignore-loader": "^0.1.2", "postcss": "^8.5.1", "tailwindcss": "^4.0.0", "ts-node": "^10.9.2", diff --git a/tsconfig.json b/tsconfig.json index 67ec08a9..b19cb99f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,5 +25,5 @@ ] }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules", "agent-docs"] + "exclude": ["node_modules", "agent-docs/**/*"] }