diff --git a/package.json b/package.json index adc8273f5..49f4dbd38 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "ava": "pnpm -C packages/test exec ava" }, "dependencies": { + "@temporalio/ai-sdk": "workspace:*", "@temporalio/client": "workspace:*", "@temporalio/cloud": "workspace:*", "@temporalio/common": "workspace:*", @@ -57,9 +58,9 @@ "temporalio": "file:packages/meta" }, "devDependencies": { - "@opentelemetry/api": "^1.7.0", - "@opentelemetry/core": "^1.19.0", - "@opentelemetry/sdk-node": "^0.46.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/sdk-node": "^0.52.1", "@tsconfig/node18": "^18.2.4", "@types/fs-extra": "^11.0.4", "@types/ms": "^0.7.34", diff --git a/packages/ai-sdk/package.json b/packages/ai-sdk/package.json new file mode 100644 index 000000000..5dc54b0e7 --- /dev/null +++ b/packages/ai-sdk/package.json @@ -0,0 +1,47 @@ +{ + "name": "@temporalio/ai-sdk", + "version": "1.13.2", + "description": "Temporal AI SDK integration package", + "main": "lib/index.js", + "types": "./lib/index.d.ts", + "keywords": [ + "temporal", + "workflow", + "ai", + "ai-sdk", + "llm" + ], + "author": "Temporal Technologies Inc. ", + "license": "MIT", + "dependencies": { + "@temporalio/plugin": "workspace:*", + "@temporalio/workflow": "workspace:*", + "@ungap/structured-clone": "^1.3.0", + "headers-polyfill": "^4.0.3", + "web-streams-polyfill": "^4.2.0" + }, + "peerDependencies": { + "@ai-sdk/provider": "^2.0.0", + "@ai-sdk/mcp": "^0.0.8", + "ai": "^5.0.91" + }, + "engines": { + "node": ">= 18.0.0" + }, + "bugs": { + "url": "https://github.com/temporalio/sdk-typescript/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/temporalio/sdk-typescript.git", + "directory": "packages/ai-sdk" + }, + "homepage": "https://github.com/temporalio/sdk-typescript/tree/main/packages/ai-sdk", + "publishConfig": { + "access": "public" + }, + "files": [ + "src", + "lib" + ] +} diff --git a/packages/ai-sdk/src/activities.ts b/packages/ai-sdk/src/activities.ts new file mode 100644 index 000000000..df1da6625 --- /dev/null +++ b/packages/ai-sdk/src/activities.ts @@ -0,0 +1,112 @@ +import type { + LanguageModelV2CallOptions, + LanguageModelV2CallWarning, + LanguageModelV2Content, + LanguageModelV2FinishReason, + LanguageModelV2ResponseMetadata, + LanguageModelV2Usage, + ProviderV2, + SharedV2Headers, + SharedV2ProviderMetadata, +} from '@ai-sdk/provider'; +import type { ToolCallOptions } from 'ai'; +import { ApplicationFailure } from '@temporalio/common'; +import type { McpClientFactories, McpClientFactory } from './mcp'; + +export interface InvokeModelArgs { + modelId: string; + options: LanguageModelV2CallOptions; +} + +export interface InvokeModelResult { + content: Array; + finishReason: LanguageModelV2FinishReason; + usage: LanguageModelV2Usage; + providerMetadata?: SharedV2ProviderMetadata; + request?: { body?: unknown }; + response?: LanguageModelV2ResponseMetadata & { headers?: SharedV2Headers; body?: unknown }; + warnings: Array; +} + +export interface ListToolResult { + description?: string; + inputSchema: any; +} + +export interface ListToolArgs { + clientArgs?: any; +} + +export interface CallToolArgs { + clientArgs?: any; + name: string; + args: any; + options: ToolCallOptions; +} + +/** + * Creates Temporal activities for AI model invocation using the provided AI SDK provider. + * These activities allow workflows to call AI models while maintaining Temporal's + * execution guarantees and replay safety. + * + * @param provider The AI SDK provider to use for model invocations + * @param mcpClientFactories A mapping of server names to functions to create mcp clients + * @returns An object containing the activity functions + * + * @experimental The AI SDK integration is an experimental feature; APIs may change without notice. + */ +export function createActivities(provider: ProviderV2, mcpClientFactories?: McpClientFactories): object { + let activities = { + async invokeModel(args: InvokeModelArgs): Promise { + const model = provider.languageModel(args.modelId); + return await model.doGenerate(args.options); + }, + }; + if (mcpClientFactories !== undefined) { + Object.entries(mcpClientFactories).forEach(([name, func]) => { + activities = { + ...activities, + ...activitiesForName(name, func), + }; + }); + } + return activities; +} + +function activitiesForName(name: string, mcpClientFactory: McpClientFactory): object { + async function listToolsActivity(args: ListToolArgs): Promise> { + const mcpClient = await mcpClientFactory(args.clientArgs); + try { + const tools = await mcpClient.tools(); + + return Object.fromEntries( + Object.entries(tools).map(([k, v]) => [ + k, + { + description: v.description, + inputSchema: v.inputSchema, + }, + ]) + ); + } finally { + await mcpClient.close(); + } + } + async function callToolActivity(args: CallToolArgs): Promise { + const mcpClient = await mcpClientFactory(args.clientArgs); + try { + const tools = await mcpClient.tools(); + const tool = tools[args.name]; + if (tool === undefined) { + throw ApplicationFailure.retryable(`Tool ${args.name} not found.`); + } + return tool.execute(args.args, args.options); + } finally { + await mcpClient.close(); + } + } + return { + [name + '-listTools']: listToolsActivity, + [name + '-callTool']: callToolActivity, + }; +} diff --git a/packages/ai-sdk/src/index.ts b/packages/ai-sdk/src/index.ts new file mode 100644 index 000000000..847e6686a --- /dev/null +++ b/packages/ai-sdk/src/index.ts @@ -0,0 +1,6 @@ +// eslint-disable-next-line import/no-unassigned-import +import './load-polyfills'; + +export * from './mcp'; +export * from './plugin'; +export * from './provider'; diff --git a/packages/ai-sdk/src/load-polyfills.ts b/packages/ai-sdk/src/load-polyfills.ts new file mode 100644 index 000000000..a11eb38b2 --- /dev/null +++ b/packages/ai-sdk/src/load-polyfills.ts @@ -0,0 +1,18 @@ +import { Headers } from 'headers-polyfill'; +import { inWorkflowContext } from '@temporalio/workflow'; + +if (inWorkflowContext()) { + // Apply Headers polyfill + if (typeof globalThis.Headers === 'undefined') { + globalThis.Headers = Headers; + } + + // eslint-disable-next-line @typescript-eslint/no-require-imports,import/no-unassigned-import + require('web-streams-polyfill/polyfill'); + // Attach the polyfill as a Global function + if (!('structuredClone' in globalThis)) { + // eslint-disable-next-line @typescript-eslint/no-require-imports,import/no-unassigned-import + const structuredClone = require('@ungap/structured-clone'); + globalThis.structuredClone = structuredClone.default; + } +} diff --git a/packages/ai-sdk/src/mcp.ts b/packages/ai-sdk/src/mcp.ts new file mode 100644 index 000000000..ac922c785 --- /dev/null +++ b/packages/ai-sdk/src/mcp.ts @@ -0,0 +1,65 @@ +import type { ToolSet } from 'ai'; +import type { experimental_MCPClient as MCPClient } from '@ai-sdk/mcp'; +import * as workflow from '@temporalio/workflow'; +import type { ActivityOptions } from '@temporalio/workflow'; +import type { ListToolResult } from './activities'; + +export type McpClientFactory = (args: unknown) => Promise; +export type McpClientFactories = { [serviceName: string]: McpClientFactory }; + +/** + * Options for the Temporal MCP Client + * + * @experimental The AI SDK plugin is an experimental feature; APIs may change without notice. + */ +export interface TemporalMCPClientOptions { + readonly name: string; + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + readonly clientArgs?: any; + readonly activityOptions?: ActivityOptions; +} + +/** + * A Temporal MCP Client which uses activities to execute list tools and call tools. + * This should match by name an MCPClientFactory registered with the AI SDK plugin to function. + * + * This is intentionally similar to the AI SDK's ``MCPClient``, but is lacking functions not used by the framework. + * It doesn't close either since the underlying clients are created in activities. + * + * @experimental The AI SDK plugin is an experimental feature; APIs may change without notice. + */ +export class TemporalMCPClient { + constructor(readonly options: TemporalMCPClientOptions) {} + + async tools(): Promise { + workflow.log.info(`Options: ${this.options.activityOptions}`); + const activities = workflow.proxyActivities({ startToCloseTimeout: '10 minutes', ...this.options.activityOptions }); + + const listActivity = activities[this.options.name + '-listTools']; + const tools: Record = await listActivity!({ clientArgs: this.options.clientArgs }); + return Object.fromEntries( + Object.entries(tools).map(([toolName, toolResult]) => [ + toolName, + { + execute: async (args: any, options) => { + const activities = workflow.proxyActivities({ + summary: toolName, + startToCloseTimeout: '10 minutes', + ...this.options, + }); + const callActivity = activities[this.options.name + '-callTool']!; + return await callActivity({ name: toolName, args, options, clientArgs: this.options.clientArgs }); + }, + inputSchema: { + ...toolResult.inputSchema, + _type: undefined, + validate: undefined, + [Symbol.for('vercel.ai.schema')]: true, + [Symbol.for('vercel.ai.validator')]: true, + }, + type: 'dynamic', + }, + ]) + ); + } +} diff --git a/packages/ai-sdk/src/plugin.ts b/packages/ai-sdk/src/plugin.ts new file mode 100644 index 000000000..87787d9eb --- /dev/null +++ b/packages/ai-sdk/src/plugin.ts @@ -0,0 +1,34 @@ +import type { ProviderV2 } from '@ai-sdk/provider'; +import { SimplePlugin } from '@temporalio/plugin'; +import { createActivities } from './activities'; +import type { McpClientFactories } from './mcp'; + +/** + * Options for the AI SDK plugin + * + * @experimental The AI SDK plugin is an experimental feature; APIs may change without notice. + */ +export interface AiSdkPluginOptions { + modelProvider: ProviderV2; + + /** + * This object contains a mapping of server names to functions which create MCP clients. + * Any TemporalMCPClient used in a workflow should have its associated servername listed in this object. + */ + mcpClientFactories?: McpClientFactories; +} + +/** + * A Temporal plugin that integrates AI SDK providers for use in workflows. + * This plugin creates activities that allow workflows to invoke AI models. + * + * @experimental The AI SDK plugin is an experimental feature; APIs may change without notice. + */ +export class AiSdkPlugin extends SimplePlugin { + constructor(options: AiSdkPluginOptions) { + super({ + name: 'AiSDKPlugin', + activities: createActivities(options.modelProvider, options.mcpClientFactories), + }); + } +} diff --git a/packages/ai-sdk/src/provider.ts b/packages/ai-sdk/src/provider.ts new file mode 100644 index 000000000..5fdab21a8 --- /dev/null +++ b/packages/ai-sdk/src/provider.ts @@ -0,0 +1,79 @@ +import type { + EmbeddingModelV2, + ImageModelV2, + LanguageModelV2, + LanguageModelV2CallOptions, + ProviderV2, + SharedV2Headers, +} from '@ai-sdk/provider'; +import * as workflow from '@temporalio/workflow'; +import { ActivityOptions } from '@temporalio/workflow'; +import { ApplicationFailure } from '@temporalio/common'; +import { InvokeModelResult } from './activities'; + +/** + * A language model implementation that delegates AI model calls to Temporal activities. + * This allows workflows to invoke AI models through the Temporal execution model. + * + * @experimental The AI SDK integration is an experimental feature; APIs may change without notice. + */ +export class TemporalLanguageModel implements LanguageModelV2 { + readonly specificationVersion = 'v2'; + readonly provider = 'temporal'; + readonly supportedUrls = {}; + + constructor( + readonly modelId: string, + readonly options?: ActivityOptions + ) {} + + async doGenerate(options: LanguageModelV2CallOptions): Promise { + const activities = workflow.proxyActivities({ startToCloseTimeout: '10 minutes', ...this.options }); + const result = await activities.invokeModel!({ modelId: this.modelId, options }); + if (result === undefined) { + throw ApplicationFailure.nonRetryable('Received undefined response from model activity.'); + } + if (result.response !== undefined) { + result.response.timestamp = new Date(result.response.timestamp); + } + return result; + } + + doStream(_options: LanguageModelV2CallOptions): PromiseLike<{ + stream: any; + request?: { body?: unknown }; + response?: { headers?: SharedV2Headers }; + }> { + throw ApplicationFailure.nonRetryable('Streaming not supported.'); + } +} + +/** + * A Temporal-specific provider implementation that creates AI models which execute + * through Temporal activities. This provider integrates AI SDK models with Temporal's + * execution model to ensure reliable, durable AI model invocations. + * + * @experimental The AI SDK integration is an experimental feature; APIs may change without notice. + */ +export class TemporalProvider implements ProviderV2 { + constructor(readonly options?: ActivityOptions) {} + + imageModel(_modelId: string): ImageModelV2 { + throw new Error('Not implemented'); + } + + languageModel(modelId: string): LanguageModelV2 { + return new TemporalLanguageModel(modelId, this.options); + } + + textEmbeddingModel(_modelId: string): EmbeddingModelV2 { + throw new Error('Not implemented'); + } +} + +/** + * A singleton instance of TemporalProvider for convenient use in applications. + * + * @experimental The AI SDK integration is an experimental feature; APIs may change without notice. + */ +export const temporalProvider: TemporalProvider = new TemporalProvider(); diff --git a/packages/ai-sdk/tsconfig.json b/packages/ai-sdk/tsconfig.json new file mode 100644 index 000000000..17be15184 --- /dev/null +++ b/packages/ai-sdk/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./lib", + "rootDir": "./src" + }, + "references": [{ "path": "../plugin" }, { "path": "../workflow" }], + "include": ["./src/**/*.ts"] +} diff --git a/packages/interceptors-opentelemetry/package.json b/packages/interceptors-opentelemetry/package.json index 2cda3fe21..443c29414 100644 --- a/packages/interceptors-opentelemetry/package.json +++ b/packages/interceptors-opentelemetry/package.json @@ -14,10 +14,10 @@ "author": "Temporal Technologies Inc. ", "license": "MIT", "dependencies": { - "@opentelemetry/api": "^1.7.0", - "@opentelemetry/core": "^1.19.0", - "@opentelemetry/resources": "^1.19.0", - "@opentelemetry/sdk-trace-base": "^1.19.0" + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1" }, "devDependencies": { "@temporalio/activity": "workspace:*", diff --git a/packages/meta/package.json b/packages/meta/package.json index a2ece3b0a..59facb3d0 100644 --- a/packages/meta/package.json +++ b/packages/meta/package.json @@ -3,6 +3,7 @@ "private": true, "description": "Temporal.io SDK meta-package", "dependencies": { + "@temporalio/ai-sdk": "workspace:*", "@temporalio/activity": "workspace:*", "@temporalio/client": "workspace:*", "@temporalio/common": "workspace:*", diff --git a/packages/plugin/src/plugin.ts b/packages/plugin/src/plugin.ts index 4fde1db70..c537467ad 100644 --- a/packages/plugin/src/plugin.ts +++ b/packages/plugin/src/plugin.ts @@ -137,9 +137,6 @@ export class SimplePlugin * @returns Promise that resolves when worker execution completes */ runWorker(worker: Worker, next: (w: Worker) => Promise): Promise { - console.log('Hello'); - console.log('This:', this); - console.log('Options:', this.options); if (this.options.runContext !== undefined) { return this.options.runContext(() => next(worker)); } diff --git a/packages/test/package.json b/packages/test/package.json index 06cf53dd5..1129cd8f8 100644 --- a/packages/test/package.json +++ b/packages/test/package.json @@ -24,15 +24,20 @@ "author": "Temporal Technologies Inc. ", "license": "MIT", "dependencies": { + "@ai-sdk/openai": "^2.0.28", + "@ai-sdk/provider": "^2.0.0", + "@ai-sdk/mcp": "^0.0.8", "@grpc/grpc-js": "^1.12.4", "@grpc/proto-loader": "^0.7.10", - "@opentelemetry/api": "^1.7.0", - "@opentelemetry/core": "^1.19.0", - "@opentelemetry/exporter-trace-otlp-grpc": "^0.46.0", - "@opentelemetry/sdk-node": "^0.46.0", - "@opentelemetry/sdk-trace-base": "^1.19.0", - "@opentelemetry/semantic-conventions": "^1.19.0", + "@modelcontextprotocol/sdk": "^1.10.2", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/exporter-trace-otlp-grpc": "^0.52.1", + "@opentelemetry/sdk-node": "^0.52.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", "@temporalio/activity": "workspace:*", + "@temporalio/ai-sdk": "workspace:*", "@temporalio/client": "workspace:*", "@temporalio/cloud": "workspace:*", "@temporalio/common": "workspace:*", @@ -46,6 +51,7 @@ "@temporalio/testing": "workspace:*", "@temporalio/worker": "workspace:*", "@temporalio/workflow": "workspace:*", + "ai": "^5.0.91", "arg": "^5.0.2", "async-retry": "^1.3.3", "ava": "^5.3.1", @@ -60,7 +66,8 @@ "protobufjs-cli": "^1.1.2", "rxjs": "7.8.1", "stack-utils": "^2.0.6", - "uuid": "^11.1.0" + "uuid": "^11.1.0", + "zod": "^3.25.76" }, "devDependencies": { "@types/async-retry": "^1.4.8", diff --git a/packages/test/src/activities/ai-sdk.ts b/packages/test/src/activities/ai-sdk.ts new file mode 100644 index 000000000..22ff429ce --- /dev/null +++ b/packages/test/src/activities/ai-sdk.ts @@ -0,0 +1,10 @@ +export async function getWeather(input: { + location: string; +}): Promise<{ city: string; temperatureRange: string; conditions: string }> { + console.log('Activity execution'); + return { + city: input.location, + temperatureRange: '14-20C', + conditions: 'Sunny with wind.', + }; +} diff --git a/packages/test/src/helpers.ts b/packages/test/src/helpers.ts index a8dd11995..eec72550c 100644 --- a/packages/test/src/helpers.ts +++ b/packages/test/src/helpers.ts @@ -192,7 +192,7 @@ if (inWorkflowContext()) { export class Worker extends worker.Worker { static async create(options: WorkerOptions): Promise { - return RealWorker.create({ ...options, reuseV8Context: REUSE_V8_CONTEXT }); + return RealWorker.create({ ...options, reuseV8Context: options.reuseV8Context ?? REUSE_V8_CONTEXT }); } } diff --git a/packages/test/src/load/worker.ts b/packages/test/src/load/worker.ts index 54686acb6..1243d2d64 100644 --- a/packages/test/src/load/worker.ts +++ b/packages/test/src/load/worker.ts @@ -3,7 +3,7 @@ import http from 'node:http'; import { inspect } from 'node:util'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'; import * as opentelemetry from '@opentelemetry/sdk-node'; -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import arg from 'arg'; import { DefaultLogger, @@ -33,7 +33,7 @@ async function withOptionalOtel(args: arg.Result, fn: () => Promi const traceExporter = new OTLPTraceExporter({ url }); const otel = new opentelemetry.NodeSDK({ resource: new opentelemetry.resources.Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'load-worker', + [SEMRESATTRS_SERVICE_NAME]: 'load-worker', taskQueue, }), traceExporter, diff --git a/packages/test/src/test-ai-sdk.ts b/packages/test/src/test-ai-sdk.ts new file mode 100644 index 000000000..6883e5358 --- /dev/null +++ b/packages/test/src/test-ai-sdk.ts @@ -0,0 +1,416 @@ +/** + * Test AI SDK integration with Temporal workflows + */ +import type { + EmbeddingModelV2, + ImageModelV2, + LanguageModelV2, + LanguageModelV2CallOptions, + LanguageModelV2CallWarning, + LanguageModelV2Content, + LanguageModelV2FinishReason, + LanguageModelV2ResponseMetadata, + LanguageModelV2Usage, + ProviderV2, + SharedV2Headers, + SharedV2ProviderMetadata, +} from '@ai-sdk/provider'; +import { openai } from '@ai-sdk/openai'; +import { v4 as uuid4 } from 'uuid'; +import * as opentelemetry from '@opentelemetry/sdk-node'; +import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; +import { ExportResultCode } from '@opentelemetry/core'; +import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; +import { experimental_createMCPClient as createMCPClient } from '@ai-sdk/mcp'; +import { AiSdkPlugin, McpClientFactory } from '@temporalio/ai-sdk'; +import { temporal } from '@temporalio/proto'; +import { WorkflowClient } from '@temporalio/client'; +import { + makeWorkflowExporter, + OpenTelemetryActivityInboundInterceptor, + OpenTelemetryActivityOutboundInterceptor, + OpenTelemetrySinks, + OpenTelemetryWorkflowClientCallsInterceptor, + OpenTelemetryWorkflowClientInterceptor, +} from '@temporalio/interceptors-opentelemetry'; +import { InjectedSinks, Runtime } from '@temporalio/worker'; +import { + generateObjectWorkflow, + helloWorldAgent, + mcpWorkflow, + middlewareWorkflow, + telemetryWorkflow, + toolsWorkflow, +} from './workflows/ai-sdk'; +import { helpers, makeTestFunction } from './helpers-integration'; +import { getWeather } from './activities/ai-sdk'; +import { Worker } from './helpers'; +import EventType = temporal.api.enums.v1.EventType; + +const remoteTests = ['1', 't', 'true'].includes((process.env.AI_SDK_REMOTE_TESTS ?? 'false').toLowerCase()); + +export type ModelResponse = { + content: Array; + finishReason: LanguageModelV2FinishReason; + usage: LanguageModelV2Usage; + providerMetadata?: SharedV2ProviderMetadata; + request?: { body?: unknown }; + response?: LanguageModelV2ResponseMetadata & { headers?: SharedV2Headers; body?: unknown }; + warnings: Array; +}; + +export class TestModel implements LanguageModelV2 { + readonly specificationVersion = 'v2'; + readonly provider = 'temporal'; + readonly supportedUrls = {}; + readonly modelId = 'TestModel'; + private generator: Generator; + private done: boolean = false; + + constructor(generator: Generator) { + this.generator = generator; + } + + async doGenerate(_: LanguageModelV2CallOptions): Promise<{ + content: Array; + finishReason: LanguageModelV2FinishReason; + usage: LanguageModelV2Usage; + providerMetadata?: SharedV2ProviderMetadata; + request?: { body?: unknown }; + response?: LanguageModelV2ResponseMetadata & { headers?: SharedV2Headers; body?: unknown }; + warnings: Array; + }> { + if (this.done) { + throw new Error('Called generate more times than responses given to the test generator'); + } + + const result = this.generator.next(); + this.done = result.done ?? false; + return result.value; + } + + doStream(_options: LanguageModelV2CallOptions): PromiseLike<{ + stream: any; + request?: { body?: unknown }; + response?: { headers?: SharedV2Headers }; + }> { + throw new Error('Streaming not supported.'); + } +} + +export class TestProvider implements ProviderV2 { + private generator: Generator; + constructor(generator: Generator) { + this.generator = generator; + } + imageModel(_modelId: string): ImageModelV2 { + throw new Error('Not implemented'); + } + + languageModel(_modelId: string): LanguageModelV2 { + return new TestModel(this.generator); + } + + textEmbeddingModel(_modelId: string): EmbeddingModelV2 { + throw new Error('Not implemented'); + } +} + +function contentResponse( + content: LanguageModelV2Content[], + finishReason: LanguageModelV2FinishReason = 'stop' +): ModelResponse { + return { + content, + finishReason, + usage: { + inputTokens: undefined, + outputTokens: undefined, + totalTokens: undefined, + }, + warnings: [], + }; +} + +function textResponse(content: string): ModelResponse { + return contentResponse([ + { + type: 'text', + text: content, + }, + ]); +} + +function toolCallResponse(toolName: string, input: string): ModelResponse { + return contentResponse( + [ + { + type: 'tool-call', + toolCallId: 'call_yY3nlDwH5BQSJo63qC61L4ZB', + toolName, + input, + }, + ], + 'tool-calls' + ); +} + +function* helloWorkflowGenerator(): Generator { + yield textResponse('Test Haiku'); +} + +const test = makeTestFunction({ + workflowsPath: require.resolve('./workflows/ai-sdk'), +}); + +test('Hello world agent responds in haikus', async (t) => { + if (remoteTests) { + t.timeout(120 * 1000); + } + const { createWorker, executeWorkflow } = helpers(t); + + const worker = await createWorker({ + plugins: [ + new AiSdkPlugin({ + modelProvider: remoteTests ? openai : new TestProvider(helloWorkflowGenerator()), + }), + ], + }); + + await worker.runUntil(async () => { + const result = await executeWorkflow(helloWorldAgent, { + args: ['Tell me about recursion in programming.'], + }); + + t.assert(result); + if (!remoteTests) { + t.is('Test Haiku', result); + } + }); +}); + +function* toolsWorkflowGenerator(): Generator { + yield toolCallResponse('getWeather', '{"location":"Tokyo"}'); + yield textResponse('Test weather result'); +} + +test('Tools workflow can use AI tools', async (t) => { + if (remoteTests) { + t.timeout(120 * 1000); + } + const { createWorker, startWorkflow } = helpers(t); + + const worker = await createWorker({ + plugins: [ + new AiSdkPlugin({ + modelProvider: remoteTests ? openai : new TestProvider(toolsWorkflowGenerator()), + }), + ], + activities: { + getWeather, + }, + }); + await worker.runUntil(async () => { + const handle = await startWorkflow(toolsWorkflow, { + args: ['What is the weather in Tokyo?'], + workflowExecutionTimeout: '10 seconds', + }); + + const result = await handle.result(); + + t.assert(result); + if (!remoteTests) { + t.is('Test weather result', result); + + // Check that activities were scheduled + const { events } = await handle.fetchHistory(); + const activityCompletedEvents = + events?.filter((e) => e.eventType === EventType.EVENT_TYPE_ACTIVITY_TASK_SCHEDULED) ?? []; + + // Should have at least 2 events: invokeModel and getWeather + t.assert( + activityCompletedEvents.length >= 2, + `Expected at least 2 activity completions, got ${activityCompletedEvents.length}` + ); + + // Check that getWeather activity was called + const activityTypes = activityCompletedEvents.map( + (e) => e?.activityTaskScheduledEventAttributes?.activityType?.name + ); + t.assert(activityTypes.includes('getWeather'), 'getWeather activity should have been called'); + } + }); +}); + +function* generateObjectWorkflowGenerator(): Generator { + yield textResponse( + '{"recipe":{"name":"Classic Lasagna","ingredients":[],"steps":["Preheat the oven to 375°F (190°C)."]}}' + ); +} + +test('Generate object', async (t) => { + if (remoteTests) { + t.timeout(120 * 1000); + } + const { createWorker, executeWorkflow } = helpers(t); + + const worker = await createWorker({ + plugins: [ + new AiSdkPlugin({ + modelProvider: remoteTests ? openai : new TestProvider(generateObjectWorkflowGenerator()), + }), + ], + }); + + await worker.runUntil(async () => { + const result = await executeWorkflow(generateObjectWorkflow, { + args: ['Tell me about recursion in programming.'], + workflowExecutionTimeout: '30 seconds', + }); + + t.assert(result); + if (!remoteTests) { + t.is('Classic Lasagna', result); + } + }); +}); + +test('Middleware', async (t) => { + if (remoteTests) { + t.timeout(120 * 1000); + } + const { createWorker, executeWorkflow } = helpers(t); + + const worker = await createWorker({ + plugins: [ + new AiSdkPlugin({ + modelProvider: remoteTests ? openai : new TestProvider(helloWorkflowGenerator()), + }), + ], + }); + + await worker.runUntil(async () => { + const result = await executeWorkflow(middlewareWorkflow, { + args: ['Tell me about recursion in programming.'], + workflowExecutionTimeout: '30 seconds', + }); + + t.assert(result); + if (!remoteTests) { + t.is('Test Haiku', result); + } + }); +}); + +test('Telemetry', async (t) => { + if (remoteTests) { + t.timeout(120 * 1000); + } + try { + const spans = Array(); + + const staticResource = new opentelemetry.resources.Resource({ + [SEMRESATTRS_SERVICE_NAME]: 'ts-test-otel-worker', + }); + const traceExporter: opentelemetry.tracing.SpanExporter = { + export(spans_, resultCallback) { + spans.push(...spans_); + resultCallback({ code: ExportResultCode.SUCCESS }); + }, + async shutdown() { + // Nothing to shutdown + }, + }; + const otel = new opentelemetry.NodeSDK({ + resource: staticResource, + traceExporter, + }); + await otel.start(); + const sinks: InjectedSinks = { + exporter: makeWorkflowExporter(traceExporter, staticResource), + }; + + const worker = await Worker.create({ + plugins: [ + new AiSdkPlugin({ + modelProvider: remoteTests ? openai : new TestProvider(helloWorkflowGenerator()), + }), + ], + taskQueue: 'test-ai-telemetry', + workflowsPath: require.resolve('./workflows/ai-sdk'), + + interceptors: { + client: { + workflow: [new OpenTelemetryWorkflowClientCallsInterceptor()], + }, + workflowModules: [require.resolve('./workflows/otel-interceptors')], + activity: [ + (ctx) => ({ + inbound: new OpenTelemetryActivityInboundInterceptor(ctx), + outbound: new OpenTelemetryActivityOutboundInterceptor(ctx), + }), + ], + }, + sinks, + }); + + const client = new WorkflowClient({ + interceptors: [new OpenTelemetryWorkflowClientInterceptor()], + }); + await worker.runUntil(async () => { + await client.execute(telemetryWorkflow, { + taskQueue: 'test-ai-telemetry', + workflowId: uuid4(), + args: ['Tell me about recursion'], + }); + }); + await otel.shutdown(); + const generateSpan = spans.find(({ name }) => name === `ai.generateText`); + t.true(generateSpan !== undefined); + } finally { + // Cleanup the runtime so that it doesn't interfere with other tests + await Runtime._instance?.shutdown(); + } +}); + +function* mcpGenerator(): Generator { + yield toolCallResponse('list_directory', '/'); + yield textResponse('Some files'); +} + +// Currently fails in CI due to invalid server response but passes locally +test.skip('MCP Use', async (t) => { + if (remoteTests) { + t.timeout(120 * 1000); + } + const { createWorker, executeWorkflow } = helpers(t); + + const mcpClientFactories = { + testServer: () => + createMCPClient({ + transport: new StdioClientTransport({ + command: 'npx', + args: ['-y', '@modelcontextprotocol/server-filesystem@latest', __dirname], + }), + }), + }; + const worker = await createWorker({ + plugins: [ + new AiSdkPlugin({ + modelProvider: remoteTests ? openai : new TestProvider(mcpGenerator()), + mcpClientFactories, + }), + ], + }); + + await worker.runUntil(async () => { + const result = await executeWorkflow(mcpWorkflow, { + args: ['Tell me what files you know about. Use your tools.'], + }); + + t.assert(result); + if (!remoteTests) { + t.is('Some files', result); + } + }); +}); diff --git a/packages/test/src/test-otel.ts b/packages/test/src/test-otel.ts index 97b29e074..3163e796d 100644 --- a/packages/test/src/test-otel.ts +++ b/packages/test/src/test-otel.ts @@ -9,7 +9,7 @@ import { ExportResultCode } from '@opentelemetry/core'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'; import * as opentelemetry from '@opentelemetry/sdk-node'; import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; -import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import test from 'ava'; import { v4 as uuid4 } from 'uuid'; import { WorkflowClient, WithStartWorkflowOperation, WorkflowClientInterceptor } from '@temporalio/client'; @@ -249,7 +249,7 @@ if (RUN_INTEGRATION_TESTS) { const spans = Array(); const staticResource = new opentelemetry.resources.Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'ts-test-otel-worker', + [SEMRESATTRS_SERVICE_NAME]: 'ts-test-otel-worker', }); const traceExporter: opentelemetry.tracing.SpanExporter = { export(spans_, resultCallback) { @@ -418,7 +418,7 @@ if (RUN_INTEGRATION_TESTS) { const oTelUrl = 'http://127.0.0.1:4317'; const exporter = new OTLPTraceExporter({ url: oTelUrl }); const staticResource = new opentelemetry.resources.Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'ts-test-otel-worker', + [SEMRESATTRS_SERVICE_NAME]: 'ts-test-otel-worker', }); const otel = new opentelemetry.NodeSDK({ resource: staticResource, @@ -533,7 +533,7 @@ if (RUN_INTEGRATION_TESTS) { test('executeUpdateWithStart works correctly with OTEL interceptors', async (t) => { const staticResource = new opentelemetry.resources.Resource({ - [SemanticResourceAttributes.SERVICE_NAME]: 'ts-test-otel-worker', + [SEMRESATTRS_SERVICE_NAME]: 'ts-test-otel-worker', }); const traceExporter: opentelemetry.tracing.SpanExporter = { export(_spans, resultCallback) { diff --git a/packages/test/src/workflows/ai-sdk.ts b/packages/test/src/workflows/ai-sdk.ts new file mode 100644 index 000000000..70a83df89 --- /dev/null +++ b/packages/test/src/workflows/ai-sdk.ts @@ -0,0 +1,111 @@ +// Test workflow using AI model +// eslint-disable-next-line import/no-unassigned-import +import '@temporalio/ai-sdk/lib/load-polyfills'; +import { generateObject, generateText, stepCountIs, tool, wrapLanguageModel } from 'ai'; +import { z } from 'zod'; +import { LanguageModelV2Middleware } from '@ai-sdk/provider'; +import { proxyActivities } from '@temporalio/workflow'; +import { TemporalMCPClient, temporalProvider } from '@temporalio/ai-sdk'; +import type * as activities from '../activities/ai-sdk'; + +const { getWeather } = proxyActivities({ + startToCloseTimeout: '1 minute', +}); + +export async function helloWorldAgent(prompt: string): Promise { + const result = await generateText({ + model: temporalProvider.languageModel('gpt-4o-mini'), + prompt, + system: 'You only respond in haikus.', + }); + return result.text; +} + +export async function toolsWorkflow(question: string): Promise { + const result = await generateText({ + model: temporalProvider.languageModel('gpt-4o-mini'), + prompt: question, + system: 'You are a helpful agent.', + tools: { + getWeather: tool({ + description: 'Get the weather for a given city', + inputSchema: z.object({ + location: z.string().describe('The location to get the weather for'), + }), + execute: getWeather, + }), + }, + stopWhen: stepCountIs(5), + }); + return result.text; +} + +export async function generateObjectWorkflow(): Promise { + const { object } = await generateObject({ + model: temporalProvider.languageModel('gpt-4o-mini'), + schema: z.object({ + recipe: z.object({ + name: z.string(), + ingredients: z.array(z.object({ name: z.string(), amount: z.string() })), + steps: z.array(z.string()), + }), + }), + prompt: 'Generate a lasagna recipe.', + }); + return object.recipe.name; +} + +export async function middlewareWorkflow(prompt: string): Promise { + const cache = new Map(); + const middleware: LanguageModelV2Middleware = { + wrapGenerate: async ({ doGenerate, params }) => { + const cacheKey = JSON.stringify(params); + if (cache.has(cacheKey)) { + return cache.get(cacheKey); + } + + const result = await doGenerate(); + + cache.set(cacheKey, result); + + return result; + }, + }; + + const model = wrapLanguageModel({ + model: temporalProvider.languageModel('gpt-4o-mini'), + middleware, + }); + + const result = await generateText({ + model, + prompt, + system: 'You only respond in haikus.', + }); + return result.text; +} + +export async function telemetryWorkflow(prompt: string): Promise { + const result = await generateText({ + model: temporalProvider.languageModel('gpt-4o-mini'), + prompt, + system: 'You only respond in haikus.', + experimental_telemetry: { + isEnabled: true, + }, + }); + return result.text; +} + +export async function mcpWorkflow(prompt: string): Promise { + const mcpClient = new TemporalMCPClient({ name: 'testServer' }); + const tools = await mcpClient.tools(); + const result = await generateText({ + model: temporalProvider.languageModel('gpt-4o-mini'), + prompt, + tools, + system: 'What files do you have?', + stopWhen: stepCountIs(5), + }); + return result.text; +} diff --git a/packages/test/tsconfig.json b/packages/test/tsconfig.json index e4de881ae..fa29ed3f1 100644 --- a/packages/test/tsconfig.json +++ b/packages/test/tsconfig.json @@ -46,6 +46,9 @@ }, { "path": "../nyc-test-coverage" + }, + { + "path": "../ai-sdk" } ], "include": ["./src/**/*.ts"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fad2defa0..eaad12e04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@temporalio/ai-sdk': + specifier: workspace:* + version: link:packages/ai-sdk '@temporalio/client': specifier: workspace:* version: link:packages/client @@ -58,14 +61,14 @@ importers: version: file:packages/meta devDependencies: '@opentelemetry/api': - specifier: ^1.7.0 - version: 1.7.0 + specifier: ^1.9.0 + version: 1.9.0 '@opentelemetry/core': - specifier: ^1.19.0 - version: 1.19.0(@opentelemetry/api@1.7.0) + specifier: ^1.25.1 + version: 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': - specifier: ^0.46.0 - version: 0.46.0(@opentelemetry/api@1.7.0) + specifier: ^0.52.1 + version: 0.52.1(@opentelemetry/api@1.9.0) '@tsconfig/node18': specifier: ^18.2.4 version: 18.2.4 @@ -145,6 +148,33 @@ importers: specifier: ^3.0.0 version: 3.0.0 + packages/ai-sdk: + dependencies: + '@ai-sdk/mcp': + specifier: ^0.0.8 + version: 0.0.8(zod@3.25.76) + '@ai-sdk/provider': + specifier: ^2.0.0 + version: 2.0.0 + '@temporalio/plugin': + specifier: workspace:* + version: link:../plugin + '@temporalio/workflow': + specifier: workspace:* + version: link:../workflow + '@ungap/structured-clone': + specifier: ^1.3.0 + version: 1.3.0 + ai: + specifier: ^5.0.91 + version: 5.0.98(zod@3.25.76) + headers-polyfill: + specifier: ^4.0.3 + version: 4.0.3 + web-streams-polyfill: + specifier: ^4.2.0 + version: 4.2.0 + packages/client: dependencies: '@grpc/grpc-js': @@ -309,17 +339,17 @@ importers: packages/interceptors-opentelemetry: dependencies: '@opentelemetry/api': - specifier: ^1.7.0 - version: 1.7.0 + specifier: ^1.9.0 + version: 1.9.0 '@opentelemetry/core': - specifier: ^1.19.0 - version: 1.19.0(@opentelemetry/api@1.7.0) + specifier: ^1.25.1 + version: 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': - specifier: ^1.19.0 - version: 1.19.0(@opentelemetry/api@1.7.0) + specifier: ^1.25.1 + version: 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': - specifier: ^1.19.0 - version: 1.19.0(@opentelemetry/api@1.7.0) + specifier: ^1.25.1 + version: 1.25.1(@opentelemetry/api@1.9.0) devDependencies: '@temporalio/activity': specifier: workspace:* @@ -342,6 +372,9 @@ importers: '@temporalio/activity': specifier: workspace:* version: link:../activity + '@temporalio/ai-sdk': + specifier: workspace:* + version: link:../ai-sdk '@temporalio/client': specifier: workspace:* version: link:../client @@ -464,33 +497,48 @@ importers: packages/test: dependencies: + '@ai-sdk/mcp': + specifier: ^0.0.8 + version: 0.0.8(zod@3.25.76) + '@ai-sdk/openai': + specifier: ^2.0.28 + version: 2.0.69(zod@3.25.76) + '@ai-sdk/provider': + specifier: ^2.0.0 + version: 2.0.0 '@grpc/grpc-js': specifier: ^1.12.4 version: 1.12.4 '@grpc/proto-loader': specifier: ^0.7.10 version: 0.7.13 + '@modelcontextprotocol/sdk': + specifier: ^1.10.2 + version: 1.22.0 '@opentelemetry/api': - specifier: ^1.7.0 - version: 1.7.0 + specifier: ^1.9.0 + version: 1.9.0 '@opentelemetry/core': - specifier: ^1.19.0 - version: 1.19.0(@opentelemetry/api@1.7.0) + specifier: ^1.25.1 + version: 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-trace-otlp-grpc': - specifier: ^0.46.0 - version: 0.46.0(@opentelemetry/api@1.7.0) + specifier: ^0.52.1 + version: 0.52.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': - specifier: ^0.46.0 - version: 0.46.0(@opentelemetry/api@1.7.0) + specifier: ^0.52.1 + version: 0.52.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': - specifier: ^1.19.0 - version: 1.19.0(@opentelemetry/api@1.7.0) + specifier: ^1.25.1 + version: 1.25.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': - specifier: ^1.19.0 - version: 1.19.0 + specifier: ^1.25.1 + version: 1.25.1 '@temporalio/activity': specifier: workspace:* version: link:../activity + '@temporalio/ai-sdk': + specifier: workspace:* + version: link:../ai-sdk '@temporalio/client': specifier: workspace:* version: link:../client @@ -530,6 +578,9 @@ importers: '@temporalio/workflow': specifier: workspace:* version: link:../workflow + ai: + specifier: ^5.0.91 + version: 5.0.98(zod@3.25.76) arg: specifier: ^5.0.2 version: 5.0.2 @@ -575,6 +626,9 @@ importers: uuid: specifier: ^11.1.0 version: 11.1.0 + zod: + specifier: ^3.25.76 + version: 3.25.76 devDependencies: '@types/async-retry': specifier: ^1.4.8 @@ -723,6 +777,34 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + '@ai-sdk/gateway@2.0.13': + resolution: {integrity: sha512-q8M+7+VEKp91I295cjNDgQ4LyGImKj5cDLVARDay7nBTXGjIRZOlthYE7K6Rbz2yHKFyTmKH7MMkYavAM7L/UQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/mcp@0.0.8': + resolution: {integrity: sha512-9y9GuGcZ9/+pMIHfpOCJgZVp+AZMv6TkjX2NVT17SQZvTF2N8LXuCXyoUPyi1PxIxzxl0n463LxxaB2O6olC+Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai@2.0.69': + resolution: {integrity: sha512-UF9qZ1qiVOpWdbj/FGf8jz+PciMI2zxt8ZNKjsvyFtUfk1E5PIG8GYR65maGblVhwKrRR5zAAJ5BumNyDt2v4Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.17': + resolution: {integrity: sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} + '@ampproject/remapping@2.2.1': resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -926,6 +1008,15 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@modelcontextprotocol/sdk@1.22.0': + resolution: {integrity: sha512-VUpl106XVTCpDmTBil2ehgJZjhyLY2QZikzF8NvTXtLRF1CvO5iEE2UNZdVIUer35vFOwMKYeUGbjJtvPWan3g==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} @@ -1123,132 +1214,124 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@opentelemetry/api-logs@0.46.0': - resolution: {integrity: sha512-+9BcqfiEDGPXEIo+o3tso/aqGM5dGbGwAkGVp3FPpZ8GlkK1YlaKRd9gMVyPaeRATwvO5wYGGnCsAc/sMMM9Qw==} + '@opentelemetry/api-logs@0.52.1': + resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} engines: {node: '>=14'} - '@opentelemetry/api@1.7.0': - resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@1.19.0': - resolution: {integrity: sha512-0i1ECOc9daKK3rjUgDDXf0GDD5XfCou5lXnt2DALIc2qKoruPPcesobNKE54laSVUWnC3jX26RzuOa31g0V32A==} + '@opentelemetry/context-async-hooks@1.25.1': + resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@1.19.0': - resolution: {integrity: sha512-w42AukJh3TP8R0IZZOVJVM/kMWu8g+lm4LzT70WtuKqhwq7KVhcDzZZuZinWZa6TtQCl7Smt2wolEYzpHabOgw==} + '@opentelemetry/core@1.25.1': + resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-trace-otlp-grpc@0.46.0': - resolution: {integrity: sha512-kR4kehnfIhv7v/2MuNYfrlh9A/ZtQofwCzurTIplornUjdzhKDGgjui1NkNTqTfM1QkqfCiavGsf5hwocx29bA==} + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1': + resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/exporter-trace-otlp-http@0.46.0': - resolution: {integrity: sha512-vZ2pYOB+qrQ+jnKPY6Gnd58y1k/Ti//Ny6/XsSX7/jED0X77crtSVgC6N5UA0JiGJOh6QB2KE9gaH99010XHzg==} + '@opentelemetry/exporter-trace-otlp-http@0.52.1': + resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/exporter-trace-otlp-proto@0.46.0': - resolution: {integrity: sha512-A7PftDM57w1TLiirrhi8ceAnCpYkpUBObELdn239IyYF67zwngImGfBLf5Yo3TTAOA2Oj1TL76L8zWVL8W+Suw==} + '@opentelemetry/exporter-trace-otlp-proto@0.52.1': + resolution: {integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/exporter-zipkin@1.19.0': - resolution: {integrity: sha512-TY1fy4JiOBN5a8T9fknqTMcz0DXIeFBr6sklaLCgwtj+G699a5R4CekNwpeM7DHSwC44UMX7gljO2I6dYsTS3A==} + '@opentelemetry/exporter-zipkin@1.25.1': + resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/instrumentation@0.46.0': - resolution: {integrity: sha512-a9TijXZZbk0vI5TGLZl+0kxyFfrXHhX6Svtz7Pp2/VBlCSKrazuULEyoJQrOknJyFWNMEmbbJgOciHCCpQcisw==} + '@opentelemetry/instrumentation@0.52.1': + resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.46.0': - resolution: {integrity: sha512-hfkh7cG17l77ZSLRAogz19SIJzr0KeC7xv5PDyTFbHFpwwoxV/bEViO49CqUFH6ckXB63NrltASP9R7po+ahTQ==} + '@opentelemetry/otlp-exporter-base@0.52.1': + resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/otlp-grpc-exporter-base@0.46.0': - resolution: {integrity: sha512-/KB/xfZZiWIY2JknvCoT/e9paIzQO3QCBN5gR6RyxpXM/AGx3YTAOKvB/Ts9Va19jo5aE74gB7emhFaCNy4Rmw==} + '@opentelemetry/otlp-grpc-exporter-base@0.52.1': + resolution: {integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/otlp-proto-exporter-base@0.46.0': - resolution: {integrity: sha512-rEJBA8U2AxfEzrdIUcyyjOweyVFkO6V1XAxwP161JkxpvNuVDdULHAfRVnGtoZhiVA1XsJKcpIIq2MEKAqq4cg==} + '@opentelemetry/otlp-transformer@0.52.1': + resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==} engines: {node: '>=14'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: - '@opentelemetry/api': ^1.0.0 + '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/otlp-transformer@0.46.0': - resolution: {integrity: sha512-Fj9hZwr6xuqgsaERn667Uf6kuDG884puWhyrai2Jen2Fq+bGf4/5BzEJp/8xvty0VSU4EfXOto/ys3KpSz2UHg==} + '@opentelemetry/propagator-b3@1.25.1': + resolution: {integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.8.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-b3@1.19.0': - resolution: {integrity: sha512-v7y5IBOKBm0vP3yf0DHzlw4L2gL6tZ0KeeMTaxfO5IuomMffDbrGWcvYFp0Dt4LdZctTSK523rVLBB9FBHBciQ==} + '@opentelemetry/propagator-jaeger@1.25.1': + resolution: {integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-jaeger@1.19.0': - resolution: {integrity: sha512-dedkOoTzKg+nYoLWCMp0Im+wo+XkTRW6aXhi8VQRtMW/9SNJGOllCJSu8llToLxMDF0+6zu7OCrKkevAof2tew==} + '@opentelemetry/resources@1.25.1': + resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.19.0': - resolution: {integrity: sha512-RgxvKuuMOf7nctOeOvpDjt2BpZvZGr9Y0vf7eGtY5XYZPkh2p7e2qub1S2IArdBMf9kEbz0SfycqCviOu9isqg==} + '@opentelemetry/sdk-logs@0.52.1': + resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' + '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-logs@0.46.0': - resolution: {integrity: sha512-Knlyk4+G72uEzNh6GRN1Fhmrj+/rkATI5/lOrevN7zRDLgp4kfyZBGGoWk7w+qQjlYvwhIIdPVxlIcipivdZIg==} + '@opentelemetry/sdk-metrics@1.25.1': + resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.8.0' - '@opentelemetry/api-logs': '>=0.39.1' + '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-metrics@1.19.0': - resolution: {integrity: sha512-FiMii40zr0Fmys4F1i8gmuCvbinBnBsDeGBr4FQemOf0iPCLytYQm5AZJ/nn4xSc71IgKBQwTFQRAGJI7JvZ4Q==} + '@opentelemetry/sdk-node@0.52.1': + resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.8.0' + '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-node@0.46.0': - resolution: {integrity: sha512-BQhzdCRZXchhKjZaFkgxlgoowjOt/QXekJ1CZgfvFO9Yg5GV15LyJFUEyQkDyD8XbshGo3Cnj0WZMBnDWtWY1A==} + '@opentelemetry/sdk-trace-base@1.25.1': + resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.8.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-base@1.19.0': - resolution: {integrity: sha512-+IRvUm+huJn2KqfFW3yW/cjvRwJ8Q7FzYHoUNx5Fr0Lws0LxjMJG1uVB8HDpLwm7mg5XXH2M5MF+0jj5cM8BpQ==} + '@opentelemetry/sdk-trace-node@1.25.1': + resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-node@1.19.0': - resolution: {integrity: sha512-TCiEq/cUjM15RFqBRwWomTVbOqzndWL4ILa7ZCu0zbjU1/XY6AgHkgrgAc7vGP6TjRqH4Xryuglol8tcIfbBUQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' - - '@opentelemetry/semantic-conventions@1.19.0': - resolution: {integrity: sha512-14jRpC8f5c0gPSwoZ7SbEJni1PqI+AhAE8m1bMz6v+RPM4OlP1PT2UHBJj5Qh/ALLPjhVU/aZUK3YyjTUqqQVg==} + '@opentelemetry/semantic-conventions@1.25.1': + resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} engines: {node: '>=14'} '@pinojs/redact@0.4.0': @@ -1323,6 +1406,9 @@ packages: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@swc/core-darwin-arm64@1.3.102': resolution: {integrity: sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA==} engines: {node: '>=10'} @@ -1634,6 +1720,13 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vercel/oidc@3.0.5': + resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==} + engines: {node: '>= 20'} + '@verdaccio/auth@8.0.0-next-8.27': resolution: {integrity: sha512-o9CWPX4vxpTNYvFwIH+0Els9uMSrqNA3vTraqTPP0F5a6nGhnRsl4E7Lsiir46Q6sDVXSXmQnEvbS9nb1amIfw==} engines: {node: '>=18'} @@ -1791,11 +1884,9 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - deprecated: package has been renamed to acorn-import-attributes - peerDependencies: - acorn: ^8 + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} @@ -1816,6 +1907,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} @@ -1835,6 +1931,20 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} + ai@5.0.98: + resolution: {integrity: sha512-RpMnwnml68Swblobvk6IdF7HLZrog72Ve6H5J3aN+A/JPg4y5CjCXeQyK1N4wJStyuTa6AoKYfJR5F4e/aVpHQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -2054,6 +2164,10 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -2336,6 +2450,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -2381,6 +2499,10 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -2827,6 +2949,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + execa@5.0.0: resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} engines: {node: '>=10'} @@ -2837,10 +2967,20 @@ packages: express-rate-limit@5.5.1: resolution: {integrity: sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==} + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2904,6 +3044,10 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} @@ -2973,6 +3117,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + front-matter@4.0.2: resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} @@ -3190,6 +3338,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + heap-js@2.6.0: resolution: {integrity: sha512-trFMIq3PATiFRiQmNNeHtsrkwYRByIXUbYNbotiY9RLVfMkdwZdd2eQ38mGt7BRiCKBaj1DyBAIHmm7mmXPuuw==} engines: {node: '>=10.0.0'} @@ -3254,6 +3405,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3273,8 +3428,8 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-in-the-middle@1.7.1: - resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} + import-in-the-middle@1.15.0: + resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} @@ -3863,6 +4018,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + mem@9.0.2: resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} engines: {node: '>=12.20'} @@ -3880,6 +4039,10 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3899,10 +4062,18 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -4054,6 +4225,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -4402,6 +4577,9 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -4460,6 +4638,10 @@ packages: resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} hasBin: true + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + pkg-conf@4.0.0: resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4619,6 +4801,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4765,6 +4951,10 @@ packages: engines: {node: '>=14'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -4821,6 +5011,10 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -4832,6 +5026,10 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -5293,6 +5491,10 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -5445,6 +5647,10 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-streams-polyfill@4.2.0: + resolution: {integrity: sha512-0rYDzGOh9EZpig92umN5g5D/9A1Kff7k0/mzPSSCY8jEQeYkgRMoY7LhbXtUCWzLCMX0TUE9aoHkjFNB7D9pfA==} + engines: {node: '>= 8'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -5576,10 +5782,49 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zod-to-json-schema@3.25.0: + resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + peerDependencies: + zod: ^3.25 || ^4 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} + '@ai-sdk/gateway@2.0.13(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@3.25.76) + '@vercel/oidc': 3.0.5 + zod: 3.25.76 + + '@ai-sdk/mcp@0.0.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@3.25.76) + pkce-challenge: 5.0.0 + zod: 3.25.76 + + '@ai-sdk/openai@2.0.69(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/provider-utils@3.0.17(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + '@ampproject/remapping@2.2.1': dependencies: '@jridgewell/gen-mapping': 0.3.3 @@ -5887,7 +6132,7 @@ snapshots: read-cmd-shim: 4.0.0 resolve-from: 5.0.0 rimraf: 4.4.1 - semver: 7.7.2 + semver: 7.7.3 set-blocking: 2.0.0 signal-exit: 3.0.7 slash: 3.0.0 @@ -5926,6 +6171,24 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} + '@modelcontextprotocol/sdk@1.22.0': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.0(zod@3.25.76) + transitivePeerDependencies: + - supports-color + '@napi-rs/wasm-runtime@0.2.4': dependencies: '@emnapi/core': 1.4.5 @@ -5987,7 +6250,7 @@ snapshots: promise-all-reject-late: 1.0.1 promise-call-limit: 3.0.2 read-package-json-fast: 3.0.2 - semver: 7.7.2 + semver: 7.7.3 ssri: 10.0.6 treeverse: 3.0.0 walk-up-path: 3.0.1 @@ -5997,7 +6260,7 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: - semver: 7.7.2 + semver: 7.7.3 '@npmcli/git@5.0.8': dependencies: @@ -6008,7 +6271,7 @@ snapshots: proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.2 + semver: 7.7.3 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -6031,7 +6294,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 pacote: 18.0.6 proc-log: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - bluebird - supports-color @@ -6048,7 +6311,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.2 proc-log: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - bluebird @@ -6081,7 +6344,7 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.3 nx: 20.8.2(@swc/core@1.3.102) - semver: 7.7.2 + semver: 7.7.3 tmp: 0.2.5 tslib: 2.6.2 yargs-parser: 21.1.1 @@ -6181,166 +6444,161 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 - '@opentelemetry/api-logs@0.46.0': + '@opentelemetry/api-logs@0.52.1': dependencies: - '@opentelemetry/api': 1.7.0 + '@opentelemetry/api': 1.9.0 - '@opentelemetry/api@1.7.0': {} + '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 + '@opentelemetry/api': 1.9.0 - '@opentelemetry/core@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/semantic-conventions': 1.19.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/exporter-trace-otlp-grpc@0.46.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.12.4 - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-transformer': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) - - '@opentelemetry/exporter-trace-otlp-http@0.46.0(@opentelemetry/api@1.7.0)': - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-exporter-base': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-transformer': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) - - '@opentelemetry/exporter-trace-otlp-proto@0.46.0(@opentelemetry/api@1.7.0)': - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-exporter-base': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-proto-exporter-base': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-transformer': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) - - '@opentelemetry/exporter-zipkin@1.19.0(@opentelemetry/api@1.7.0)': - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/semantic-conventions': 1.19.0 - - '@opentelemetry/instrumentation@0.46.0(@opentelemetry/api@1.7.0)': - dependencies: - '@opentelemetry/api': 1.7.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 '@types/shimmer': 1.0.5 - import-in-the-middle: 1.7.1 + import-in-the-middle: 1.15.0 require-in-the-middle: 7.2.0 - semver: 7.7.2 + semver: 7.7.3 shimmer: 1.2.1 transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.46.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base@0.46.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.12.4 - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-exporter-base': 0.46.0(@opentelemetry/api@1.7.0) - protobufjs: 7.5.1 - - '@opentelemetry/otlp-proto-exporter-base@0.46.0(@opentelemetry/api@1.7.0)': - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/otlp-exporter-base': 0.46.0(@opentelemetry/api@1.7.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) protobufjs: 7.5.1 - '@opentelemetry/otlp-transformer@0.46.0(@opentelemetry/api@1.7.0)': - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/api-logs': 0.46.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-logs': 0.46.0(@opentelemetry/api-logs@0.46.0)(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-metrics': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) - - '@opentelemetry/propagator-b3@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/semantic-conventions': 1.19.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/sdk-logs@0.46.0(@opentelemetry/api-logs@0.46.0)(@opentelemetry/api@1.7.0)': + '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/api-logs': 0.46.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) lodash.merge: 4.6.2 - '@opentelemetry/sdk-node@0.46.0(@opentelemetry/api@1.7.0)': - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/api-logs': 0.46.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/exporter-trace-otlp-http': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/exporter-zipkin': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/instrumentation': 0.46.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-logs': 0.46.0(@opentelemetry/api-logs@0.46.0)(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-metrics': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-node': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/semantic-conventions': 1.19.0 + '@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 transitivePeerDependencies: - supports-color - '@opentelemetry/sdk-trace-base@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/resources': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/semantic-conventions': 1.19.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/sdk-trace-node@1.19.0(@opentelemetry/api@1.7.0)': + '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/context-async-hooks': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/core': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/propagator-b3': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/propagator-jaeger': 1.19.0(@opentelemetry/api@1.7.0) - '@opentelemetry/sdk-trace-base': 1.19.0(@opentelemetry/api@1.7.0) - semver: 7.7.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + semver: 7.7.3 - '@opentelemetry/semantic-conventions@1.19.0': {} + '@opentelemetry/semantic-conventions@1.25.1': {} '@pinojs/redact@0.4.0': {} @@ -6408,6 +6666,8 @@ snapshots: '@sindresorhus/is@5.6.0': {} + '@standard-schema/spec@1.0.0': {} + '@swc/core-darwin-arm64@1.3.102': optional: true @@ -6773,6 +7033,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} + + '@vercel/oidc@3.0.5': {} + '@verdaccio/auth@8.0.0-next-8.27': dependencies: '@verdaccio/config': 8.0.0-next-8.27 @@ -7037,14 +7301,19 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-assertions@1.9.0(acorn@8.11.3): + accepts@2.0.0: dependencies: - acorn: 8.11.3 + mime-types: 3.0.2 + negotiator: 1.0.0 acorn-import-attributes@1.9.5(acorn@8.11.3): dependencies: acorn: 8.11.3 + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 @@ -7053,6 +7322,8 @@ snapshots: acorn@8.11.3: {} + acorn@8.15.0: {} + add-stream@1.0.0: {} agent-base@6.0.2: @@ -7073,6 +7344,18 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 + ai@5.0.98(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 2.0.13(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -7323,6 +7606,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.1 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -7625,6 +7922,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.1: {} + content-type@1.0.5: {} conventional-changelog-angular@7.0.0: @@ -7654,7 +7953,7 @@ snapshots: handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 7.7.2 + semver: 7.7.3 split: 1.0.1 conventional-commits-filter@3.0.0: @@ -7685,6 +7984,8 @@ snapshots: cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} + cookie@0.7.1: {} core-util-is@1.0.2: {} @@ -8165,6 +8466,12 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + execa@5.0.0: dependencies: cross-spawn: 7.0.6 @@ -8181,6 +8488,10 @@ snapshots: express-rate-limit@5.5.1: {} + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + express@4.21.2: dependencies: accepts: 1.3.8 @@ -8217,6 +8528,38 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.1 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.2.2 + debug: 4.4.1 + 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.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + extend@3.0.2: {} extsprintf@1.3.0: {} @@ -8282,6 +8625,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-up@2.1.0: dependencies: locate-path: 2.0.0 @@ -8349,6 +8703,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + front-matter@4.0.2: dependencies: js-yaml: 3.14.2 @@ -8453,7 +8809,7 @@ snapshots: git-semver-tags@5.0.1: dependencies: meow: 8.1.2 - semver: 7.7.2 + semver: 7.7.3 git-up@7.0.0: dependencies: @@ -8615,6 +8971,8 @@ snapshots: dependencies: function-bind: 1.1.2 + headers-polyfill@4.0.3: {} + heap-js@2.6.0: {} hosted-git-info@2.8.9: {} @@ -8685,6 +9043,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore-by-default@2.1.0: {} @@ -8700,10 +9062,10 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.7.1: + import-in-the-middle@1.15.0: dependencies: - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 @@ -8735,7 +9097,7 @@ snapshots: npm-package-arg: 11.0.2 promzard: 1.0.2 read: 3.0.1 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -9201,7 +9563,7 @@ snapshots: npm-package-arg: 11.0.2 npm-registry-fetch: 17.1.0 proc-log: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 sigstore: 2.3.1 ssri: 10.0.6 transitivePeerDependencies: @@ -9318,7 +9680,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-fetch-happen@13.0.1: dependencies: @@ -9374,6 +9736,8 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + mem@9.0.2: dependencies: map-age-cleaner: 0.1.3 @@ -9404,6 +9768,8 @@ snapshots: merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -9417,10 +9783,16 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mime@3.0.0: {} @@ -9542,6 +9914,8 @@ snapshots: negotiator@0.6.4: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} nexus-rpc@0.0.1: {} @@ -9567,7 +9941,7 @@ snapshots: make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: @@ -9594,13 +9968,13 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -9615,7 +9989,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 npm-normalize-package-bin@3.0.1: {} @@ -9623,7 +9997,7 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-name: 5.0.1 npm-packlist@8.0.2: @@ -9635,7 +10009,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.2 - semver: 7.7.2 + semver: 7.7.3 npm-registry-fetch@17.1.0: dependencies: @@ -9681,7 +10055,7 @@ snapshots: open: 8.4.2 ora: 5.3.0 resolve.exports: 2.0.3 - semver: 7.7.2 + semver: 7.7.3 string-width: 4.2.3 tar-stream: 2.2.0 tmp: 0.2.5 @@ -9959,6 +10333,8 @@ snapshots: path-to-regexp@0.1.12: {} + path-to-regexp@8.3.0: {} + path-type@3.0.0: dependencies: pify: 3.0.0 @@ -10016,6 +10392,8 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 + pkce-challenge@5.0.0: {} + pkg-conf@4.0.0: dependencies: find-up: 6.3.0 @@ -10177,6 +10555,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -10277,7 +10662,7 @@ snapshots: require-in-the-middle@7.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -10339,6 +10724,16 @@ snapshots: dependencies: glob: 9.3.5 + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + run-async@2.4.1: {} run-parallel@1.2.0: @@ -10402,6 +10797,22 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serialize-error@7.0.1: dependencies: type-fest: 0.13.1 @@ -10419,6 +10830,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -10734,6 +11154,7 @@ snapshots: temporalio@file:packages/meta: dependencies: '@temporalio/activity': link:packages/activity + '@temporalio/ai-sdk': link:packages/ai-sdk '@temporalio/client': link:packages/client '@temporalio/common': link:packages/common '@temporalio/envconfig': link:packages/envconfig @@ -10914,6 +11335,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.7 @@ -11102,6 +11529,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-streams-polyfill@4.2.0: {} + webidl-conversions@3.0.1: {} webpack-sources@3.2.3: {} @@ -11262,3 +11691,9 @@ snapshots: yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} + + zod-to-json-schema@3.25.0(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 692af4f31..9d6f2d406 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - packages/activity + - packages/ai-sdk - packages/client - packages/cloud - packages/common diff --git a/tsconfig.prune.json b/tsconfig.prune.json index 279f3c083..4d59abde8 100644 --- a/tsconfig.prune.json +++ b/tsconfig.prune.json @@ -7,6 +7,7 @@ }, "files": [ "./packages/activity/src/index.ts", + "./packages/ai-sdk/src/index.ts", "./packages/client/src/index.ts", "./packages/cloud/src/index.ts", "./packages/common/src/index.ts",