kopia lustrzana https://github.com/transitive-bullshit/chatgpt-api
feat: WIP initial work on API gateway
rodzic
0f8af8173c
commit
3abdae9cd6
|
@ -2,7 +2,8 @@ import {
|
|||
agenticProjectConfigSchema,
|
||||
type OriginAdapter,
|
||||
type PricingPlanList,
|
||||
type Tool
|
||||
type Tool,
|
||||
type ToolConfig
|
||||
} from '@agentic/platform-schemas'
|
||||
import { validators } from '@agentic/platform-validators'
|
||||
import { relations } from '@fisch0920/drizzle-orm'
|
||||
|
@ -74,23 +75,16 @@ export const deployments = pgTable(
|
|||
onDelete: 'cascade'
|
||||
}),
|
||||
|
||||
// TODO: Tool definitions
|
||||
// tools: jsonb().$type<Tool[]>().default([]),
|
||||
|
||||
// TODO: metadata config (logo, keywords, examples, etc)
|
||||
// TODO: webhooks
|
||||
// TODO: third-party auth provider config
|
||||
// NOTE: will need consumer.authProviders as well as user.authProviders for
|
||||
// this because custom oauth credentials that are deployment-specific. will
|
||||
// prolly also need to hash the individual AuthProviders in
|
||||
// deployment.authProviders to compare across deployments.
|
||||
|
||||
// Tool definitions exposed by the origin server
|
||||
tools: jsonb().$type<Tool[]>().notNull(),
|
||||
|
||||
// Tool configs customize the behavior of tools for different pricing plans
|
||||
toolConfigs: jsonb().$type<ToolConfig[]>().default([]).notNull(),
|
||||
|
||||
// Origin API URL
|
||||
originUrl: text().notNull(),
|
||||
|
||||
// Origin API adapter config (openapi, mcp, hosted externally or internally, etc)
|
||||
// Origin API adapter config (openapi, mcp, raw, hosting considerations, etc)
|
||||
originAdapter: jsonb().$type<OriginAdapter>().notNull(),
|
||||
|
||||
// Array<PricingPlan>
|
||||
|
@ -99,7 +93,14 @@ export const deployments = pgTable(
|
|||
// Which pricing intervals are supported for subscriptions to this project
|
||||
pricingIntervals: pricingIntervalEnum().array().default(['month']).notNull()
|
||||
|
||||
// coupons: jsonb().$type<Coupon[]>().default([]).notNull()
|
||||
// TODO: metadata config (logo, keywords, examples, etc)
|
||||
// TODO: webhooks
|
||||
// TODO: coupons
|
||||
// TODO: third-party auth provider config
|
||||
// NOTE: will need consumer.authProviders as well as user.authProviders for
|
||||
// this because custom oauth credentials that are deployment-specific. will
|
||||
// prolly also need to hash the individual AuthProviders in
|
||||
// deployment.authProviders to compare across deployments.
|
||||
},
|
||||
(table) => [
|
||||
uniqueIndex('deployment_identifier_idx').on(table.identifier),
|
||||
|
@ -155,7 +156,9 @@ export const deploymentSelectSchema = createSelectSchema(deployments, {
|
|||
sourceUrl: agenticProjectConfigSchema.shape.sourceUrl,
|
||||
originAdapter: agenticProjectConfigSchema.shape.originAdapter,
|
||||
pricingPlans: agenticProjectConfigSchema.shape.pricingPlans,
|
||||
pricingIntervals: agenticProjectConfigSchema.shape.pricingIntervals
|
||||
pricingIntervals: agenticProjectConfigSchema.shape.pricingIntervals,
|
||||
tools: agenticProjectConfigSchema.shape.toolConfigs,
|
||||
toolConfigs: agenticProjectConfigSchema.shape.toolConfigs
|
||||
})
|
||||
.omit({
|
||||
originUrl: true
|
||||
|
|
|
@ -19,10 +19,13 @@ export async function resolveDeployment({
|
|||
if (!deploymentIdentifier) {
|
||||
const config = await loadAgenticConfig({ cwd })
|
||||
|
||||
// TODO: team support
|
||||
// TODO: re-add team support
|
||||
const auth = AuthStore.getAuth()
|
||||
const namespace = auth.user.username
|
||||
|
||||
// TODO: resolve deploymentIdentifier; config name may include namespace?
|
||||
// TODO: rename parseFaasIdentifier; movingn away from FaaS terminology
|
||||
|
||||
deploymentIdentifier = `${namespace}/${config.name}@${fuzzyDeploymentIdentifierVersion}`
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
"@agentic/platform-openapi": "workspace:*",
|
||||
"@agentic/platform-validators": "workspace:*",
|
||||
"@hono/zod-openapi": "catalog:",
|
||||
"@modelcontextprotocol/sdk": "catalog:",
|
||||
"ms": "catalog:",
|
||||
"semver": "catalog:",
|
||||
"zod": "catalog:"
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
import { z } from '@hono/zod-openapi'
|
||||
|
||||
import { originAdapterSchema } from './origin-adapter'
|
||||
import {
|
||||
originAdapterConfigSchema,
|
||||
originAdapterSchema
|
||||
} from './origin-adapter'
|
||||
import {
|
||||
pricingIntervalListSchema,
|
||||
type PricingPlan,
|
||||
pricingPlanListSchema
|
||||
} from './pricing'
|
||||
import { toolConfigSchema } from './tools'
|
||||
import { toolConfigSchema, toolSchema } from './tools'
|
||||
|
||||
// TODO:
|
||||
// - **service / tool definitions**
|
||||
|
@ -101,7 +104,7 @@ NOTE: Agentic currently only supports \`external\` API servers. If you'd like to
|
|||
* for how origin tools / services are defined: either as an OpenAPI spec,
|
||||
* an MCP server, or as a raw HTTP REST API.
|
||||
*/
|
||||
originAdapter: originAdapterSchema.optional().default({
|
||||
originAdapter: originAdapterConfigSchema.optional().default({
|
||||
location: 'external',
|
||||
type: 'raw'
|
||||
}),
|
||||
|
@ -115,7 +118,7 @@ NOTE: Agentic currently only supports \`external\` API servers. If you'd like to
|
|||
.default([defaultFreePricingPlan]),
|
||||
|
||||
/**
|
||||
* Optional list of billing intervals to enable in the pricingPlans.
|
||||
* Optional list of billing intervals to enable in pricing plans.
|
||||
*
|
||||
* Defaults to a single monthly interval `['month']`.
|
||||
*
|
||||
|
@ -163,7 +166,7 @@ To add support for annual pricing plans, for example, you can use: \`['month', '
|
|||
* `toolConfigs`, it will use the default behavior of the Agentic API
|
||||
* gateway.
|
||||
*/
|
||||
toolConfigs: z.array(toolConfigSchema).optional()
|
||||
toolConfigs: z.array(toolConfigSchema).default([]).optional()
|
||||
})
|
||||
.strip()
|
||||
|
||||
|
@ -171,3 +174,12 @@ export type AgenticProjectConfigInput = z.input<
|
|||
typeof agenticProjectConfigSchema
|
||||
>
|
||||
export type AgenticProjectConfig = z.output<typeof agenticProjectConfigSchema>
|
||||
|
||||
export const resolvedAgenticProjectConfigSchema =
|
||||
agenticProjectConfigSchema.extend({
|
||||
originAdapter: originAdapterSchema,
|
||||
tools: z.array(toolSchema).default([])
|
||||
})
|
||||
export type ResolvedAgenticProjectConfig = z.output<
|
||||
typeof resolvedAgenticProjectConfigSchema
|
||||
>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
export * from './agentic-project-config'
|
||||
export * from './define-config'
|
||||
export * from './mcp'
|
||||
export * from './origin-adapter'
|
||||
export * from './pricing'
|
||||
export * from './rate-limit'
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
import { z } from '@hono/zod-openapi'
|
||||
|
||||
/**
|
||||
* Capabilities that a server may support.
|
||||
*
|
||||
* Known capabilities are defined here, in this schema, but this is not a
|
||||
* closed set: any server can define its own, additional capabilities.
|
||||
*/
|
||||
export const mcpServerCapabilitiesSchema = z
|
||||
.object({
|
||||
/**
|
||||
* Experimental, non-standard capabilities that the server supports.
|
||||
*/
|
||||
experimental: z.optional(z.object({}).passthrough()),
|
||||
|
||||
/**
|
||||
* Present if the server supports sending log messages to the client.
|
||||
*/
|
||||
logging: z.optional(z.object({}).passthrough()),
|
||||
|
||||
/**
|
||||
* Present if the server supports sending completions to the client.
|
||||
*/
|
||||
completions: z.optional(z.object({}).passthrough()),
|
||||
|
||||
/**
|
||||
* Present if the server offers any prompt templates.
|
||||
*/
|
||||
prompts: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports issuing notifications for changes to
|
||||
* the prompt list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean())
|
||||
})
|
||||
.passthrough()
|
||||
),
|
||||
|
||||
/**
|
||||
* Present if the server offers any resources to read.
|
||||
*/
|
||||
resources: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports clients subscribing to resource updates.
|
||||
*/
|
||||
subscribe: z.optional(z.boolean()),
|
||||
|
||||
/**
|
||||
* Whether this server supports issuing notifications for changes to
|
||||
* the resource list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean())
|
||||
})
|
||||
.passthrough()
|
||||
),
|
||||
|
||||
/**
|
||||
* Present if the server offers any tools to call.
|
||||
*/
|
||||
tools: z.optional(
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Whether this server supports issuing notifications for changes to
|
||||
* the tool list.
|
||||
*/
|
||||
listChanged: z.optional(z.boolean())
|
||||
})
|
||||
.passthrough()
|
||||
)
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
/**
|
||||
* After receiving an initialize request from the client, the server sends
|
||||
* this response.
|
||||
*/
|
||||
export const mcpServerInfoSchema = z.object({
|
||||
/**
|
||||
* The name of the MCP server.
|
||||
*/
|
||||
name: z.string(),
|
||||
|
||||
/**
|
||||
* The version of the MCP server.
|
||||
*/
|
||||
version: z.string(),
|
||||
|
||||
/**
|
||||
* The advertised capabilities of the MCP server.
|
||||
*/
|
||||
capabilities: mcpServerCapabilitiesSchema.optional(),
|
||||
|
||||
/**
|
||||
* Instructions describing how to use the server and its features.
|
||||
*
|
||||
* This can be used by clients to improve the LLM's understanding of
|
||||
* available tools, resources, etc. It can be thought of like a "hint" to the
|
||||
* model. For example, this information MAY be added to the system prompt.
|
||||
*/
|
||||
instructions: z.string().optional()
|
||||
})
|
|
@ -1,5 +1,7 @@
|
|||
import { z } from '@hono/zod-openapi'
|
||||
|
||||
import { mcpServerInfoSchema } from './mcp'
|
||||
|
||||
export const originAdapterLocationSchema = z.literal('external')
|
||||
// z.union([
|
||||
// z.literal('external'),
|
||||
|
@ -31,59 +33,146 @@ export const commonOriginAdapterSchema = z.object({
|
|||
// - internal http
|
||||
// - etc
|
||||
|
||||
export const openapiOriginAdapterConfigSchema = commonOriginAdapterSchema.merge(
|
||||
z.object({
|
||||
/**
|
||||
* OpenAPI 3.x spec describing the origin API server.
|
||||
*/
|
||||
type: z.literal('openapi'),
|
||||
|
||||
/**
|
||||
* Local file path, URL, or JSON stringified OpenAPI spec describing the
|
||||
* origin API server.
|
||||
*
|
||||
* Must be a 3.x OpenAPI spec (older versions are not supported).
|
||||
*/
|
||||
spec: z
|
||||
.string()
|
||||
.describe(
|
||||
'Local file path, URL, or JSON stringified OpenAPI spec describing the origin API server.'
|
||||
)
|
||||
})
|
||||
)
|
||||
|
||||
export const mcpOriginAdapterConfigSchema = commonOriginAdapterSchema.merge(
|
||||
z.object({
|
||||
/**
|
||||
* MCP server.
|
||||
*/
|
||||
type: z.literal('mcp')
|
||||
})
|
||||
)
|
||||
|
||||
export const rawOriginAdapterConfigSchema = commonOriginAdapterSchema.merge(
|
||||
z.object({
|
||||
/**
|
||||
* Marks the origin server as a raw HTTP REST API without any additional
|
||||
* tool or service definitions.
|
||||
*
|
||||
* In this mode, Agentic's API gateway acts as a simple reverse-proxy
|
||||
* to the origin server, without validating tools.
|
||||
*/
|
||||
type: z.literal('raw')
|
||||
})
|
||||
)
|
||||
|
||||
/**
|
||||
* Origin API adapter is used to configure the origin API server downstream
|
||||
* from Agentic's API gateway. It specifies whether the origin API server
|
||||
* denoted by `originUrl` is hosted externally or deployed internally to
|
||||
* Agentic's infrastructure. It also specifies the format for how origin tools
|
||||
* are defined: either as an OpenAPI spec, an MCP server, or as a raw HTTP
|
||||
* REST API.
|
||||
* Origin adapter is used to configure the origin API server downstream from
|
||||
* Agentic's API gateway. It specifies whether the origin API server denoted
|
||||
* by `originUrl` is hosted externally or deployed internally to Agentic's
|
||||
* infrastructure. It also specifies the format for how origin tools are
|
||||
* defined: either an OpenAPI spec, an MCP server, or as a raw HTTP REST API.
|
||||
*
|
||||
* NOTE: Agentic currently only supports `external` API servers. If you'd like
|
||||
* to host your API or MCP server on Agentic's infrastructure, please reach out
|
||||
* to support@agentic.so.
|
||||
*/
|
||||
export const originAdapterSchema = z
|
||||
export const originAdapterConfigSchema = z
|
||||
.discriminatedUnion('type', [
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* OpenAPI 3.x spec describing the origin API server.
|
||||
*/
|
||||
type: z.literal('openapi'),
|
||||
openapiOriginAdapterConfigSchema,
|
||||
|
||||
/**
|
||||
* JSON stringified OpenAPI spec describing the origin API server.
|
||||
*
|
||||
* The origin API servers are be hidden in the embedded OpenAPI spec,
|
||||
* because clients should only be aware of the upstream Agentic API
|
||||
* gateway.
|
||||
*/
|
||||
spec: z
|
||||
.string()
|
||||
.describe(
|
||||
'JSON stringified OpenAPI spec describing the origin API server.'
|
||||
)
|
||||
})
|
||||
.merge(commonOriginAdapterSchema),
|
||||
mcpOriginAdapterConfigSchema,
|
||||
|
||||
z
|
||||
.object({
|
||||
/**
|
||||
* Marks the origin server as a raw HTTP REST API without any additional
|
||||
* tool or service definitions.
|
||||
*
|
||||
* In this mode, Agentic's API gateway acts as a simple reverse-proxy
|
||||
* to the origin server, without validating tools or services.
|
||||
*/
|
||||
type: z.literal('raw')
|
||||
})
|
||||
.merge(commonOriginAdapterSchema)
|
||||
rawOriginAdapterConfigSchema
|
||||
])
|
||||
.describe(
|
||||
`Deployment origin API adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by \`originUrl\` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools / services are defined: either as an OpenAPI spec, an MCP server, or as a raw HTTP REST API.
|
||||
`Origin adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by \`originUrl\` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools are defined: either an OpenAPI spec, an MCP server, or a raw HTTP REST API.
|
||||
|
||||
NOTE: Agentic currently only supports \`external\` API servers. If you'd like to host your API or MCP server on Agentic's infrastructure, please reach out to support@agentic.so.`
|
||||
)
|
||||
.openapi('OriginAdapterConfig')
|
||||
export type OriginAdapterConfig = z.infer<typeof originAdapterConfigSchema>
|
||||
|
||||
export const openapiOriginAdapterSchema = commonOriginAdapterSchema.merge(
|
||||
z.object({
|
||||
/**
|
||||
* OpenAPI 3.x spec describing the origin API server.
|
||||
*/
|
||||
type: z.literal('openapi'),
|
||||
|
||||
/**
|
||||
* JSON stringified OpenAPI spec describing the origin API server.
|
||||
*
|
||||
* The origin API servers are be hidden in the embedded OpenAPI spec,
|
||||
* because clients should only be aware of the upstream Agentic API
|
||||
* gateway.
|
||||
*/
|
||||
spec: z
|
||||
.string()
|
||||
.describe(
|
||||
'JSON stringified OpenAPI spec describing the origin API server.'
|
||||
)
|
||||
|
||||
// TODO: Mapping from tool names to OpenAPI operations, with all the info
|
||||
// the Agentic API gateway needs to know at runtime (HTTP method, path,
|
||||
// params, etc).
|
||||
})
|
||||
)
|
||||
|
||||
export const mcpOriginAdapterSchema = commonOriginAdapterSchema.merge(
|
||||
z.object({
|
||||
/**
|
||||
* MCP server.
|
||||
*/
|
||||
type: z.literal('mcp'),
|
||||
|
||||
/**
|
||||
* MCP server info: name, version, capabilities, instructions, etc.
|
||||
*/
|
||||
serverInfo: mcpServerInfoSchema
|
||||
})
|
||||
)
|
||||
|
||||
export const rawOriginAdapterSchema = commonOriginAdapterSchema.merge(
|
||||
z.object({
|
||||
/**
|
||||
* Marks the origin server as a raw HTTP REST API without any additional
|
||||
* tool or service definitions.
|
||||
*
|
||||
* In this mode, Agentic's API gateway acts as a simple reverse-proxy
|
||||
* to the origin server, without validating tools.
|
||||
*/
|
||||
type: z.literal('raw')
|
||||
})
|
||||
)
|
||||
|
||||
/**
|
||||
* Origin adapter is used to configure the origin API server downstream from
|
||||
* Agentic's API gateway. It specifies whether the origin API server denoted
|
||||
* by `originUrl` is hosted externally or deployed internally to Agentic's
|
||||
* infrastructure. It also specifies the format for how origin tools are
|
||||
* defined: either an OpenAPI spec, an MCP server, or as a raw HTTP REST API.
|
||||
*/
|
||||
export const originAdapterSchema = z
|
||||
.discriminatedUnion('type', [
|
||||
openapiOriginAdapterSchema,
|
||||
|
||||
mcpOriginAdapterSchema,
|
||||
|
||||
rawOriginAdapterSchema
|
||||
])
|
||||
.describe(
|
||||
`Origin adapter is used to configure the origin API server downstream from Agentic's API gateway. It specifies whether the origin API server denoted by \`originUrl\` is hosted externally or deployed internally to Agentic's infrastructure. It also specifies the format for how origin tools are defined: either an OpenAPI spec, an MCP server, or a raw HTTP REST API.`
|
||||
)
|
||||
.openapi('OriginAdapter')
|
||||
export type OriginAdapter = z.infer<typeof originAdapterSchema>
|
||||
|
|
|
@ -9,115 +9,14 @@ export const toolNameSchema = z
|
|||
.regex(/^[a-zA-Z0-9_]+$/)
|
||||
.nonempty()
|
||||
|
||||
/**
|
||||
* Additional properties describing a Tool to clients.
|
||||
*
|
||||
* NOTE: All properties in ToolAnnotations are **hints**.
|
||||
*
|
||||
* They are not guaranteed to provide a faithful description of tool behavior
|
||||
* (including descriptive properties like `title`).
|
||||
*
|
||||
* Clients should never make tool use decisions based on ToolAnnotations
|
||||
* received from untrusted servers.
|
||||
*/
|
||||
export const toolAnnotationsSchema = z
|
||||
export const jsonSchemaObjectSchema = z
|
||||
.object({
|
||||
/**
|
||||
* A human-readable title for the tool.
|
||||
*/
|
||||
title: z.string().optional(),
|
||||
|
||||
/**
|
||||
* If true, the tool does not modify its environment.
|
||||
*
|
||||
* Default: false
|
||||
*/
|
||||
readOnlyHint: z.boolean().optional(),
|
||||
|
||||
/**
|
||||
* If true, the tool may perform destructive updates to its environment.
|
||||
* If false, the tool performs only additive updates.
|
||||
*
|
||||
* (This property is meaningful only when `readOnlyHint == false`)
|
||||
*
|
||||
* Default: true
|
||||
*/
|
||||
destructiveHint: z.boolean().optional(),
|
||||
|
||||
/**
|
||||
* If true, calling the tool repeatedly with the same arguments
|
||||
* will have no additional effect on the its environment.
|
||||
*
|
||||
* (This property is meaningful only when `readOnlyHint == false`)
|
||||
*
|
||||
* Default: false
|
||||
*/
|
||||
idempotentHint: z.boolean().optional(),
|
||||
|
||||
/**
|
||||
* If true, this tool may interact with an "open world" of external
|
||||
* entities. If false, the tool's domain of interaction is closed.
|
||||
* For example, the world of a web search tool is open, whereas that
|
||||
* of a memory tool is not.
|
||||
*
|
||||
* Default: true
|
||||
*/
|
||||
openWorldHint: z.boolean().optional()
|
||||
type: z.literal('object'),
|
||||
properties: z.object({}).passthrough().optional(),
|
||||
required: z.array(z.string()).optional()
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
/**
|
||||
* Definition for an Agentic tool.
|
||||
*/
|
||||
export const toolSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The name of the tool, which acts as a unique, stable identifier for the
|
||||
* tool across deployments.
|
||||
*
|
||||
* @example `"get_weather"`
|
||||
* @example `"google_search"`
|
||||
*/
|
||||
name: toolNameSchema,
|
||||
|
||||
/**
|
||||
* A description of the tool intended to be used in prompts for LLMs to
|
||||
* understand when and how to use the tool.
|
||||
*/
|
||||
description: z.string().optional(),
|
||||
|
||||
/**
|
||||
* A JSON Schema object defining the expected parameters for the tool.
|
||||
*/
|
||||
inputSchema: z
|
||||
.object({
|
||||
type: z.literal('object'),
|
||||
properties: z.object({}).passthrough().optional(),
|
||||
required: z.array(z.string()).optional()
|
||||
})
|
||||
.passthrough(),
|
||||
|
||||
/**
|
||||
* An optional JSON Schema object defining the structure of the tool's
|
||||
* output.
|
||||
*/
|
||||
outputSchema: z
|
||||
.object({
|
||||
type: z.literal('object'),
|
||||
properties: z.object({}).passthrough().optional(),
|
||||
required: z.array(z.string()).optional()
|
||||
})
|
||||
.passthrough()
|
||||
.optional(),
|
||||
|
||||
/**
|
||||
* Optional additional tool information.
|
||||
*/
|
||||
annotations: toolAnnotationsSchema.optional()
|
||||
})
|
||||
.passthrough()
|
||||
.openapi('Tool')
|
||||
export type Tool = z.infer<typeof toolSchema>
|
||||
.openapi('JsonSchemaObject')
|
||||
|
||||
/**
|
||||
* Customizes a tool's behavior for a given pricing plan.
|
||||
|
@ -245,5 +144,104 @@ export const toolConfigSchema = z
|
|||
.openapi('ToolConfig')
|
||||
export type ToolConfig = z.infer<typeof toolConfigSchema>
|
||||
|
||||
export const toolMapSchema = z.record(toolNameSchema, toolSchema)
|
||||
export type ToolMap = z.infer<typeof toolMapSchema>
|
||||
/**
|
||||
* Additional properties describing a Tool to clients.
|
||||
*
|
||||
* NOTE: All properties in ToolAnnotations are **hints**.
|
||||
*
|
||||
* They are not guaranteed to provide a faithful description of tool behavior
|
||||
* (including descriptive properties like `title`).
|
||||
*
|
||||
* Clients should never make tool use decisions based on ToolAnnotations
|
||||
* received from untrusted servers.
|
||||
*/
|
||||
export const toolAnnotationsSchema = z
|
||||
.object({
|
||||
/**
|
||||
* A human-readable title for the tool.
|
||||
*/
|
||||
title: z.string().optional(),
|
||||
|
||||
/**
|
||||
* If true, the tool does not modify its environment.
|
||||
*
|
||||
* Default: false
|
||||
*/
|
||||
readOnlyHint: z.boolean().optional(),
|
||||
|
||||
/**
|
||||
* If true, the tool may perform destructive updates to its environment.
|
||||
* If false, the tool performs only additive updates.
|
||||
*
|
||||
* (This property is meaningful only when `readOnlyHint == false`)
|
||||
*
|
||||
* Default: true
|
||||
*/
|
||||
destructiveHint: z.boolean().optional(),
|
||||
|
||||
/**
|
||||
* If true, calling the tool repeatedly with the same arguments
|
||||
* will have no additional effect on the its environment.
|
||||
*
|
||||
* (This property is meaningful only when `readOnlyHint == false`)
|
||||
*
|
||||
* Default: false
|
||||
*/
|
||||
idempotentHint: z.boolean().optional(),
|
||||
|
||||
/**
|
||||
* If true, this tool may interact with an "open world" of external
|
||||
* entities. If false, the tool's domain of interaction is closed.
|
||||
* For example, the world of a web search tool is open, whereas that
|
||||
* of a memory tool is not.
|
||||
*
|
||||
* Default: true
|
||||
*/
|
||||
openWorldHint: z.boolean().optional()
|
||||
})
|
||||
.passthrough()
|
||||
|
||||
/**
|
||||
* Definition for an Agentic tool.
|
||||
*/
|
||||
export const toolSchema = z
|
||||
.object({
|
||||
/**
|
||||
* The name of the tool, which acts as a unique, stable identifier for the
|
||||
* tool across deployments.
|
||||
*
|
||||
* @example `"get_weather"`
|
||||
* @example `"google_search"`
|
||||
*/
|
||||
name: toolNameSchema,
|
||||
|
||||
/**
|
||||
* A description of the tool intended to be used in prompts for LLMs to
|
||||
* understand when and how to use the tool.
|
||||
*/
|
||||
description: z.string().optional(),
|
||||
|
||||
/**
|
||||
* A JSON Schema object defining the expected parameters for the tool.
|
||||
*/
|
||||
inputSchema: jsonSchemaObjectSchema,
|
||||
|
||||
/**
|
||||
* An optional JSON Schema object defining the structure of the tool's
|
||||
* output.
|
||||
*/
|
||||
outputSchema: jsonSchemaObjectSchema.optional(),
|
||||
|
||||
/**
|
||||
* Optional additional tool information.
|
||||
*
|
||||
* Used by MCP servers.
|
||||
*/
|
||||
annotations: toolAnnotationsSchema.optional()
|
||||
})
|
||||
.passthrough()
|
||||
.openapi('Tool')
|
||||
export type Tool = z.infer<typeof toolSchema>
|
||||
|
||||
// export const toolMapSchema = z.record(toolNameSchema, toolSchema)
|
||||
// export type ToolMap = z.infer<typeof toolMapSchema>
|
||||
|
|
|
@ -7,7 +7,9 @@ import type { PricingPlanLineItem } from './pricing'
|
|||
import {
|
||||
type AgenticProjectConfig,
|
||||
type AgenticProjectConfigInput,
|
||||
agenticProjectConfigSchema
|
||||
agenticProjectConfigSchema,
|
||||
type ResolvedAgenticProjectConfig,
|
||||
resolvedAgenticProjectConfigSchema
|
||||
} from './agentic-project-config'
|
||||
import { getPricingPlansByInterval } from './utils'
|
||||
import { validateOriginAdapter } from './validate-origin-adapter'
|
||||
|
@ -18,7 +20,7 @@ export async function validateAgenticProjectConfig(
|
|||
strip = false,
|
||||
...opts
|
||||
}: { logger?: Logger; cwd?: URL; strip?: boolean; label?: string } = {}
|
||||
): Promise<AgenticProjectConfig> {
|
||||
): Promise<ResolvedAgenticProjectConfig> {
|
||||
const config = parseZodSchema<
|
||||
AgenticProjectConfig,
|
||||
ZodTypeDef,
|
||||
|
@ -240,12 +242,18 @@ export async function validateAgenticProjectConfig(
|
|||
)
|
||||
}
|
||||
|
||||
await validateOriginAdapter({
|
||||
const { originAdapter, tools } = await validateOriginAdapter({
|
||||
name,
|
||||
version: config.version,
|
||||
label: `project "${name}"`,
|
||||
...opts,
|
||||
originUrl,
|
||||
originAdapter: config.originAdapter
|
||||
})
|
||||
|
||||
return config
|
||||
return parseZodSchema(resolvedAgenticProjectConfigSchema, {
|
||||
...config,
|
||||
originAdapter,
|
||||
tools
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1,25 +1,35 @@
|
|||
import type { OriginAdapter } from '@agentic/platform-schemas'
|
||||
import type {
|
||||
OriginAdapter,
|
||||
OriginAdapterConfig,
|
||||
Tool
|
||||
} from '@agentic/platform-schemas'
|
||||
import { assert, type Logger } from '@agentic/platform-core'
|
||||
import { validateOpenAPISpec } from '@agentic/platform-openapi'
|
||||
import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js'
|
||||
|
||||
/**
|
||||
* Validates and normalizes the origin adapter config for a project.
|
||||
*
|
||||
* NOTE: This method may mutate `originAdapter.spec`.
|
||||
*/
|
||||
export async function validateOriginAdapter({
|
||||
name,
|
||||
version = '0.0.0',
|
||||
originUrl,
|
||||
originAdapter,
|
||||
label,
|
||||
cwd,
|
||||
logger
|
||||
}: {
|
||||
name: string
|
||||
originUrl: string
|
||||
originAdapter: OriginAdapter
|
||||
originAdapter: OriginAdapterConfig
|
||||
label: string
|
||||
version?: string
|
||||
cwd?: URL
|
||||
logger?: Logger
|
||||
}): Promise<void> {
|
||||
}): Promise<{
|
||||
originAdapter: OriginAdapter
|
||||
tools?: Tool[]
|
||||
}> {
|
||||
assert(originUrl, 400, `Origin URL is required for ${label}`)
|
||||
|
||||
if (originAdapter.type === 'openapi') {
|
||||
|
@ -40,18 +50,59 @@ export async function validateOriginAdapter({
|
|||
delete openapiSpec.servers
|
||||
|
||||
// TODO: Additional, agentic-specific validation of the OpenAPI spec's
|
||||
// operations to ensure they are valid AI functions.
|
||||
// operations to ensure they are valid tools.
|
||||
|
||||
// TODO: Simplify OpenAPI spec by removing any query params and headers
|
||||
// specific to the Agentic API gateway.
|
||||
|
||||
// Update the openapi spec with the normalized version
|
||||
originAdapter.spec = JSON.stringify(openapiSpec)
|
||||
// TODO: Extract tool definitions from OpenAPI operationIds
|
||||
|
||||
return {
|
||||
originAdapter: {
|
||||
...originAdapter,
|
||||
// Update the openapi spec with the normalized version
|
||||
spec: JSON.stringify(openapiSpec)
|
||||
}
|
||||
}
|
||||
} else if (originAdapter.type === 'mcp') {
|
||||
// TODO: Validate MCP server info and tools
|
||||
|
||||
const { SSEClientTransport } = await import(
|
||||
'@modelcontextprotocol/sdk/client/sse.js'
|
||||
)
|
||||
const transport = new SSEClientTransport(new URL(originUrl))
|
||||
const client = new McpClient({ name, version })
|
||||
await client.connect(transport)
|
||||
|
||||
const serverInfo = {
|
||||
name,
|
||||
version,
|
||||
...client.getServerVersion(),
|
||||
capabilities: client.getServerCapabilities(),
|
||||
instructions: client.getInstructions()
|
||||
}
|
||||
|
||||
const listToolsResponse = await client.listTools()
|
||||
|
||||
// TODO: Validate MCP tools
|
||||
const tools = listToolsResponse.tools
|
||||
|
||||
return {
|
||||
originAdapter: {
|
||||
...originAdapter,
|
||||
serverInfo
|
||||
},
|
||||
tools
|
||||
}
|
||||
} else {
|
||||
assert(
|
||||
originAdapter.type === 'raw',
|
||||
400,
|
||||
`Invalid origin adapter type "${originAdapter.type}" for ${label}`
|
||||
)
|
||||
|
||||
return {
|
||||
originAdapter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
431
pnpm-lock.yaml
431
pnpm-lock.yaml
|
@ -30,6 +30,9 @@ catalogs:
|
|||
'@hono/zod-openapi':
|
||||
specifier: ^0.19.6
|
||||
version: 0.19.6
|
||||
'@modelcontextprotocol/sdk':
|
||||
specifier: ^1.11.2
|
||||
version: 1.12.0
|
||||
'@openauthjs/openauth':
|
||||
specifier: ^0.4.3
|
||||
version: 0.4.3
|
||||
|
@ -494,6 +497,9 @@ importers:
|
|||
'@hono/zod-openapi':
|
||||
specifier: 'catalog:'
|
||||
version: 0.19.6(hono@4.7.10)(zod@3.25.30)
|
||||
'@modelcontextprotocol/sdk':
|
||||
specifier: 'catalog:'
|
||||
version: 1.12.0
|
||||
ms:
|
||||
specifier: 'catalog:'
|
||||
version: 2.1.3
|
||||
|
@ -1245,6 +1251,10 @@ packages:
|
|||
'@jridgewell/trace-mapping@0.3.9':
|
||||
resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
|
||||
|
||||
'@modelcontextprotocol/sdk@1.12.0':
|
||||
resolution: {integrity: sha512-m//7RlINx1F3sz3KqwY1WWzVgTcYX52HYk4bJ1hkBXV3zccAEth+jRvG8DBRrdaQuRsPAJOx2MH3zaHNCKL7Zg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@napi-rs/wasm-runtime@0.2.10':
|
||||
resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==}
|
||||
|
||||
|
@ -1955,6 +1965,10 @@ packages:
|
|||
'@vitest/utils@3.1.4':
|
||||
resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==}
|
||||
|
||||
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==}
|
||||
peerDependencies:
|
||||
|
@ -2107,6 +2121,10 @@ packages:
|
|||
blake3-wasm@2.1.5:
|
||||
resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
|
||||
|
||||
body-parser@2.2.0:
|
||||
resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
bottleneck@2.19.5:
|
||||
resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
|
||||
|
||||
|
@ -2142,6 +2160,10 @@ packages:
|
|||
peerDependencies:
|
||||
esbuild: '>=0.18'
|
||||
|
||||
bytes@3.1.2:
|
||||
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
cac@6.7.14:
|
||||
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
@ -2257,6 +2279,18 @@ packages:
|
|||
resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
|
||||
engines: {node: ^14.18.0 || >=16.10.0}
|
||||
|
||||
content-disposition@1.0.0:
|
||||
resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
content-type@1.0.5:
|
||||
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
cookie-signature@1.2.2:
|
||||
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
|
||||
engines: {node: '>=6.6.0'}
|
||||
|
||||
cookie@0.7.2:
|
||||
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
@ -2264,6 +2298,10 @@ packages:
|
|||
core-js-compat@3.41.0:
|
||||
resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==}
|
||||
|
||||
cors@2.8.5:
|
||||
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
cross-spawn@7.0.6:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
@ -2350,6 +2388,10 @@ packages:
|
|||
resolution: {integrity: sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
depd@2.0.0:
|
||||
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
detect-libc@2.0.4:
|
||||
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
|
||||
engines: {node: '>=8'}
|
||||
|
@ -2466,6 +2508,9 @@ packages:
|
|||
eastasianwidth@0.2.0:
|
||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
||||
|
||||
ee-first@1.1.1:
|
||||
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
|
||||
|
||||
electron-to-chromium@1.5.143:
|
||||
resolution: {integrity: sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==}
|
||||
|
||||
|
@ -2482,6 +2527,10 @@ packages:
|
|||
emoji-regex@9.2.2:
|
||||
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
|
||||
|
||||
encodeurl@2.0.0:
|
||||
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
env-paths@3.0.0:
|
||||
resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
|
@ -2544,6 +2593,9 @@ packages:
|
|||
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
escape-html@1.0.3:
|
||||
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
|
||||
|
||||
escape-string-regexp@1.0.5:
|
||||
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
|
||||
engines: {node: '>=0.8.0'}
|
||||
|
@ -2691,6 +2743,10 @@ packages:
|
|||
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
etag@1.8.1:
|
||||
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
eventemitter3@5.0.1:
|
||||
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
|
||||
|
||||
|
@ -2698,6 +2754,14 @@ packages:
|
|||
resolution: {integrity: sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
eventsource-parser@3.0.2:
|
||||
resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
eventsource@3.0.7:
|
||||
resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
exit-hook@2.2.1:
|
||||
resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==}
|
||||
engines: {node: '>=6'}
|
||||
|
@ -2710,6 +2774,16 @@ packages:
|
|||
resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
|
||||
express-rate-limit@7.5.0:
|
||||
resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==}
|
||||
engines: {node: '>= 16'}
|
||||
peerDependencies:
|
||||
express: ^4.11 || 5 || ^5.0.0-beta.1
|
||||
|
||||
express@5.1.0:
|
||||
resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
exsolve@1.0.5:
|
||||
resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==}
|
||||
|
||||
|
@ -2754,6 +2828,10 @@ packages:
|
|||
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
finalhandler@2.1.0:
|
||||
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
find-up-simple@1.0.1:
|
||||
resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
@ -2788,6 +2866,14 @@ packages:
|
|||
forwarded-parse@2.1.2:
|
||||
resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==}
|
||||
|
||||
forwarded@0.2.0:
|
||||
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
fresh@2.0.0:
|
||||
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
fsevents@2.3.3:
|
||||
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
|
@ -2909,10 +2995,18 @@ packages:
|
|||
resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
|
||||
engines: {node: ^16.14.0 || >=18.0.0}
|
||||
|
||||
http-errors@2.0.0:
|
||||
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
https-proxy-agent@7.0.6:
|
||||
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
|
||||
engines: {node: '>= 14'}
|
||||
|
||||
iconv-lite@0.6.3:
|
||||
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
ignore@5.3.2:
|
||||
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
|
||||
engines: {node: '>= 4'}
|
||||
|
@ -2940,10 +3034,17 @@ packages:
|
|||
resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
inherits@2.0.4:
|
||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||
|
||||
internal-slot@1.1.0:
|
||||
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
ipaddr.js@1.9.1:
|
||||
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
is-absolute-url@4.0.1:
|
||||
resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
|
@ -3057,6 +3158,9 @@ packages:
|
|||
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
is-promise@4.0.0:
|
||||
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
|
||||
|
||||
is-regex@1.2.1:
|
||||
resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
@ -3270,6 +3374,10 @@ packages:
|
|||
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
media-typer@1.1.0:
|
||||
resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
memorystream@0.3.1:
|
||||
resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
|
||||
engines: {node: '>= 0.10.0'}
|
||||
|
@ -3278,6 +3386,10 @@ packages:
|
|||
resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
merge-descriptors@2.0.0:
|
||||
resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
merge2@1.4.1:
|
||||
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
||||
engines: {node: '>= 8'}
|
||||
|
@ -3286,6 +3398,14 @@ packages:
|
|||
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
||||
engines: {node: '>=8.6'}
|
||||
|
||||
mime-db@1.54.0:
|
||||
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
mime-types@3.0.1:
|
||||
resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
mime@3.0.0:
|
||||
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
|
@ -3350,6 +3470,10 @@ packages:
|
|||
natural-compare@1.4.0:
|
||||
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
||||
|
||||
negotiator@1.0.0:
|
||||
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
node-releases@2.0.19:
|
||||
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
|
||||
|
||||
|
@ -3405,6 +3529,13 @@ packages:
|
|||
ohash@2.0.11:
|
||||
resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
|
||||
|
||||
on-finished@2.4.1:
|
||||
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
once@1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
|
||||
onetime@7.0.0:
|
||||
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
@ -3472,6 +3603,10 @@ packages:
|
|||
resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
parseurl@1.3.3:
|
||||
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
path-exists@4.0.0:
|
||||
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
|
||||
engines: {node: '>=8'}
|
||||
|
@ -3490,6 +3625,10 @@ packages:
|
|||
path-to-regexp@6.3.0:
|
||||
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
|
||||
|
||||
path-to-regexp@8.2.0:
|
||||
resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
path-type@6.0.0:
|
||||
resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
@ -3532,6 +3671,10 @@ packages:
|
|||
resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
pkce-challenge@5.0.0:
|
||||
resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
|
||||
pkg-types@1.3.1:
|
||||
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
|
||||
|
||||
|
@ -3600,6 +3743,10 @@ packages:
|
|||
prop-types@15.8.1:
|
||||
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
|
||||
|
||||
proxy-addr@2.0.7:
|
||||
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
||||
engines: {node: '>= 0.10'}
|
||||
|
||||
punycode@2.3.1:
|
||||
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||
engines: {node: '>=6'}
|
||||
|
@ -3614,6 +3761,14 @@ packages:
|
|||
queue-microtask@1.2.3:
|
||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||
|
||||
range-parser@1.2.1:
|
||||
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
raw-body@3.0.0:
|
||||
resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
react-is@16.13.1:
|
||||
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
|
||||
|
||||
|
@ -3700,6 +3855,10 @@ packages:
|
|||
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
||||
hasBin: true
|
||||
|
||||
router@2.2.0:
|
||||
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
run-applescript@7.0.0:
|
||||
resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
|
||||
engines: {node: '>=18'}
|
||||
|
@ -3711,6 +3870,9 @@ packages:
|
|||
resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
|
||||
engines: {node: '>=0.4'}
|
||||
|
||||
safe-buffer@5.2.1:
|
||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||
|
||||
safe-push-apply@1.0.0:
|
||||
resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
@ -3722,6 +3884,9 @@ packages:
|
|||
safe-regex@2.1.1:
|
||||
resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==}
|
||||
|
||||
safer-buffer@2.1.2:
|
||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
||||
|
||||
semver@6.3.1:
|
||||
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
|
||||
hasBin: true
|
||||
|
@ -3731,6 +3896,14 @@ packages:
|
|||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
send@1.2.0:
|
||||
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
serve-static@2.2.0:
|
||||
resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
set-function-length@1.2.2:
|
||||
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
@ -3743,6 +3916,9 @@ packages:
|
|||
resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
setprototypeof@1.2.0:
|
||||
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
||||
|
||||
sharp@0.33.5:
|
||||
resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
|
||||
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
|
||||
|
@ -3848,6 +4024,10 @@ packages:
|
|||
stacktracey@2.1.8:
|
||||
resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==}
|
||||
|
||||
statuses@2.0.1:
|
||||
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
std-env@3.9.0:
|
||||
resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
|
||||
|
||||
|
@ -3988,6 +4168,10 @@ packages:
|
|||
resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
toidentifier@1.0.1:
|
||||
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
|
||||
engines: {node: '>=0.6'}
|
||||
|
||||
toucan-js@4.1.1:
|
||||
resolution: {integrity: sha512-GTPwEaCRN8IbYe5/VeGiwxYvMO0dKaC16fTeLbF+QGswjkLZ9JUqAfDhLMyH2SWukYhmetH+uxWa1Bhluv/evQ==}
|
||||
|
||||
|
@ -4089,6 +4273,10 @@ packages:
|
|||
resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
type-is@2.0.1:
|
||||
resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
typed-array-buffer@1.0.3:
|
||||
resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
@ -4155,6 +4343,10 @@ packages:
|
|||
universal-user-agent@7.0.3:
|
||||
resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==}
|
||||
|
||||
unpipe@1.0.0:
|
||||
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
update-browserslist-db@1.1.3:
|
||||
resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
|
||||
hasBin: true
|
||||
|
@ -4174,6 +4366,10 @@ packages:
|
|||
validate-npm-package-license@3.0.4:
|
||||
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
|
||||
|
||||
vary@1.1.2:
|
||||
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
vite-node@3.1.4:
|
||||
resolution: {integrity: sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==}
|
||||
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
|
||||
|
@ -4333,6 +4529,9 @@ packages:
|
|||
resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
wrappy@1.0.2:
|
||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||
|
||||
ws@8.18.0:
|
||||
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
|
@ -4860,6 +5059,22 @@ snapshots:
|
|||
'@jridgewell/resolve-uri': 3.1.2
|
||||
'@jridgewell/sourcemap-codec': 1.5.0
|
||||
|
||||
'@modelcontextprotocol/sdk@1.12.0':
|
||||
dependencies:
|
||||
ajv: 6.12.6
|
||||
content-type: 1.0.5
|
||||
cors: 2.8.5
|
||||
cross-spawn: 7.0.6
|
||||
eventsource: 3.0.7
|
||||
express: 5.1.0
|
||||
express-rate-limit: 7.5.0(express@5.1.0)
|
||||
pkce-challenge: 5.0.0
|
||||
raw-body: 3.0.0
|
||||
zod: 3.25.30
|
||||
zod-to-json-schema: 3.24.5(zod@3.25.30)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@napi-rs/wasm-runtime@0.2.10':
|
||||
dependencies:
|
||||
'@emnapi/core': 1.4.3
|
||||
|
@ -5685,6 +5900,11 @@ snapshots:
|
|||
loupe: 3.1.3
|
||||
tinyrainbow: 2.0.0
|
||||
|
||||
accepts@2.0.0:
|
||||
dependencies:
|
||||
mime-types: 3.0.1
|
||||
negotiator: 1.0.0
|
||||
|
||||
acorn-import-attributes@1.9.5(acorn@8.14.1):
|
||||
dependencies:
|
||||
acorn: 8.14.1
|
||||
|
@ -5843,6 +6063,20 @@ snapshots:
|
|||
|
||||
blake3-wasm@2.1.5: {}
|
||||
|
||||
body-parser@2.2.0:
|
||||
dependencies:
|
||||
bytes: 3.1.2
|
||||
content-type: 1.0.5
|
||||
debug: 4.4.1(supports-color@10.0.0)
|
||||
http-errors: 2.0.0
|
||||
iconv-lite: 0.6.3
|
||||
on-finished: 2.4.1
|
||||
qs: 6.14.0
|
||||
raw-body: 3.0.0
|
||||
type-is: 2.0.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
bottleneck@2.19.5: {}
|
||||
|
||||
brace-expansion@1.1.11:
|
||||
|
@ -5878,6 +6112,8 @@ snapshots:
|
|||
esbuild: 0.25.4
|
||||
load-tsconfig: 0.2.5
|
||||
|
||||
bytes@3.1.2: {}
|
||||
|
||||
cac@6.7.14: {}
|
||||
|
||||
call-bind-apply-helpers@1.0.2:
|
||||
|
@ -5987,12 +6223,25 @@ snapshots:
|
|||
|
||||
consola@3.4.2: {}
|
||||
|
||||
content-disposition@1.0.0:
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
content-type@1.0.5: {}
|
||||
|
||||
cookie-signature@1.2.2: {}
|
||||
|
||||
cookie@0.7.2: {}
|
||||
|
||||
core-js-compat@3.41.0:
|
||||
dependencies:
|
||||
browserslist: 4.24.4
|
||||
|
||||
cors@2.8.5:
|
||||
dependencies:
|
||||
object-assign: 4.1.1
|
||||
vary: 1.1.2
|
||||
|
||||
cross-spawn@7.0.6:
|
||||
dependencies:
|
||||
path-key: 3.1.1
|
||||
|
@ -6078,6 +6327,8 @@ snapshots:
|
|||
p-map: 7.0.3
|
||||
slash: 5.1.0
|
||||
|
||||
depd@2.0.0: {}
|
||||
|
||||
detect-libc@2.0.4: {}
|
||||
|
||||
doctrine@2.1.0:
|
||||
|
@ -6114,6 +6365,8 @@ snapshots:
|
|||
|
||||
eastasianwidth@0.2.0: {}
|
||||
|
||||
ee-first@1.1.1: {}
|
||||
|
||||
electron-to-chromium@1.5.143: {}
|
||||
|
||||
email-validator@2.0.4: {}
|
||||
|
@ -6124,6 +6377,8 @@ snapshots:
|
|||
|
||||
emoji-regex@9.2.2: {}
|
||||
|
||||
encodeurl@2.0.0: {}
|
||||
|
||||
env-paths@3.0.0: {}
|
||||
|
||||
environment@1.1.0: {}
|
||||
|
@ -6290,6 +6545,8 @@ snapshots:
|
|||
|
||||
escalade@3.2.0: {}
|
||||
|
||||
escape-html@1.0.3: {}
|
||||
|
||||
escape-string-regexp@1.0.5: {}
|
||||
|
||||
escape-string-regexp@4.0.0: {}
|
||||
|
@ -6511,18 +6768,62 @@ snapshots:
|
|||
|
||||
esutils@2.0.3: {}
|
||||
|
||||
etag@1.8.1: {}
|
||||
|
||||
eventemitter3@5.0.1: {}
|
||||
|
||||
eventid@2.0.1:
|
||||
dependencies:
|
||||
uuid: 8.3.2
|
||||
|
||||
eventsource-parser@3.0.2: {}
|
||||
|
||||
eventsource@3.0.7:
|
||||
dependencies:
|
||||
eventsource-parser: 3.0.2
|
||||
|
||||
exit-hook@2.2.1: {}
|
||||
|
||||
exit-hook@4.0.0: {}
|
||||
|
||||
expect-type@1.2.1: {}
|
||||
|
||||
express-rate-limit@7.5.0(express@5.1.0):
|
||||
dependencies:
|
||||
express: 5.1.0
|
||||
|
||||
express@5.1.0:
|
||||
dependencies:
|
||||
accepts: 2.0.0
|
||||
body-parser: 2.2.0
|
||||
content-disposition: 1.0.0
|
||||
content-type: 1.0.5
|
||||
cookie: 0.7.2
|
||||
cookie-signature: 1.2.2
|
||||
debug: 4.4.1(supports-color@10.0.0)
|
||||
encodeurl: 2.0.0
|
||||
escape-html: 1.0.3
|
||||
etag: 1.8.1
|
||||
finalhandler: 2.1.0
|
||||
fresh: 2.0.0
|
||||
http-errors: 2.0.0
|
||||
merge-descriptors: 2.0.0
|
||||
mime-types: 3.0.1
|
||||
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
|
||||
|
||||
exsolve@1.0.5: {}
|
||||
|
||||
fast-content-type-parse@3.0.0: {}
|
||||
|
@ -6563,6 +6864,17 @@ snapshots:
|
|||
dependencies:
|
||||
to-regex-range: 5.0.1
|
||||
|
||||
finalhandler@2.1.0:
|
||||
dependencies:
|
||||
debug: 4.4.1(supports-color@10.0.0)
|
||||
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-simple@1.0.1: {}
|
||||
|
||||
find-up@5.0.0:
|
||||
|
@ -6598,6 +6910,10 @@ snapshots:
|
|||
|
||||
forwarded-parse@2.1.2: {}
|
||||
|
||||
forwarded@0.2.0: {}
|
||||
|
||||
fresh@2.0.0: {}
|
||||
|
||||
fsevents@2.3.3:
|
||||
optional: true
|
||||
|
||||
|
@ -6729,6 +7045,14 @@ snapshots:
|
|||
dependencies:
|
||||
lru-cache: 10.4.3
|
||||
|
||||
http-errors@2.0.0:
|
||||
dependencies:
|
||||
depd: 2.0.0
|
||||
inherits: 2.0.4
|
||||
setprototypeof: 1.2.0
|
||||
statuses: 2.0.1
|
||||
toidentifier: 1.0.1
|
||||
|
||||
https-proxy-agent@7.0.6(supports-color@10.0.0):
|
||||
dependencies:
|
||||
agent-base: 7.1.3
|
||||
|
@ -6736,6 +7060,10 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
iconv-lite@0.6.3:
|
||||
dependencies:
|
||||
safer-buffer: 2.1.2
|
||||
|
||||
ignore@5.3.2: {}
|
||||
|
||||
ignore@7.0.4: {}
|
||||
|
@ -6758,12 +7086,16 @@ snapshots:
|
|||
|
||||
index-to-position@1.1.0: {}
|
||||
|
||||
inherits@2.0.4: {}
|
||||
|
||||
internal-slot@1.1.0:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
hasown: 2.0.2
|
||||
side-channel: 1.1.0
|
||||
|
||||
ipaddr.js@1.9.1: {}
|
||||
|
||||
is-absolute-url@4.0.1: {}
|
||||
|
||||
is-array-buffer@3.0.5:
|
||||
|
@ -6862,6 +7194,8 @@ snapshots:
|
|||
|
||||
is-plain-obj@4.1.0: {}
|
||||
|
||||
is-promise@4.0.0: {}
|
||||
|
||||
is-regex@1.2.1:
|
||||
dependencies:
|
||||
call-bound: 1.0.4
|
||||
|
@ -7078,10 +7412,14 @@ snapshots:
|
|||
|
||||
math-intrinsics@1.1.0: {}
|
||||
|
||||
media-typer@1.1.0: {}
|
||||
|
||||
memorystream@0.3.1: {}
|
||||
|
||||
meow@13.2.0: {}
|
||||
|
||||
merge-descriptors@2.0.0: {}
|
||||
|
||||
merge2@1.4.1: {}
|
||||
|
||||
micromatch@4.0.8:
|
||||
|
@ -7089,6 +7427,12 @@ snapshots:
|
|||
braces: 3.0.3
|
||||
picomatch: 2.3.1
|
||||
|
||||
mime-db@1.54.0: {}
|
||||
|
||||
mime-types@3.0.1:
|
||||
dependencies:
|
||||
mime-db: 1.54.0
|
||||
|
||||
mime@3.0.0: {}
|
||||
|
||||
mimic-function@5.0.1: {}
|
||||
|
@ -7154,6 +7498,8 @@ snapshots:
|
|||
|
||||
natural-compare@1.4.0: {}
|
||||
|
||||
negotiator@1.0.0: {}
|
||||
|
||||
node-releases@2.0.19: {}
|
||||
|
||||
normalize-package-data@6.0.2:
|
||||
|
@ -7233,6 +7579,14 @@ snapshots:
|
|||
|
||||
ohash@2.0.11: {}
|
||||
|
||||
on-finished@2.4.1:
|
||||
dependencies:
|
||||
ee-first: 1.1.1
|
||||
|
||||
once@1.4.0:
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
|
||||
onetime@7.0.0:
|
||||
dependencies:
|
||||
mimic-function: 5.0.1
|
||||
|
@ -7333,6 +7687,8 @@ snapshots:
|
|||
index-to-position: 1.1.0
|
||||
type-fest: 4.41.0
|
||||
|
||||
parseurl@1.3.3: {}
|
||||
|
||||
path-exists@4.0.0: {}
|
||||
|
||||
path-key@3.1.1: {}
|
||||
|
@ -7346,6 +7702,8 @@ snapshots:
|
|||
|
||||
path-to-regexp@6.3.0: {}
|
||||
|
||||
path-to-regexp@8.2.0: {}
|
||||
|
||||
path-type@6.0.0: {}
|
||||
|
||||
pathe@2.0.3: {}
|
||||
|
@ -7374,6 +7732,8 @@ snapshots:
|
|||
|
||||
pirates@4.0.7: {}
|
||||
|
||||
pkce-challenge@5.0.0: {}
|
||||
|
||||
pkg-types@1.3.1:
|
||||
dependencies:
|
||||
confbox: 0.1.8
|
||||
|
@ -7423,6 +7783,11 @@ snapshots:
|
|||
object-assign: 4.1.1
|
||||
react-is: 16.13.1
|
||||
|
||||
proxy-addr@2.0.7:
|
||||
dependencies:
|
||||
forwarded: 0.2.0
|
||||
ipaddr.js: 1.9.1
|
||||
|
||||
punycode@2.3.1: {}
|
||||
|
||||
qs@6.14.0:
|
||||
|
@ -7433,6 +7798,15 @@ snapshots:
|
|||
|
||||
queue-microtask@1.2.3: {}
|
||||
|
||||
range-parser@1.2.1: {}
|
||||
|
||||
raw-body@3.0.0:
|
||||
dependencies:
|
||||
bytes: 3.1.2
|
||||
http-errors: 2.0.0
|
||||
iconv-lite: 0.6.3
|
||||
unpipe: 1.0.0
|
||||
|
||||
react-is@16.13.1: {}
|
||||
|
||||
read-package-json-fast@4.0.0:
|
||||
|
@ -7549,6 +7923,16 @@ snapshots:
|
|||
'@rollup/rollup-win32-x64-msvc': 4.40.0
|
||||
fsevents: 2.3.3
|
||||
|
||||
router@2.2.0:
|
||||
dependencies:
|
||||
debug: 4.4.1(supports-color@10.0.0)
|
||||
depd: 2.0.0
|
||||
is-promise: 4.0.0
|
||||
parseurl: 1.3.3
|
||||
path-to-regexp: 8.2.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
run-applescript@7.0.0: {}
|
||||
|
||||
run-parallel@1.2.0:
|
||||
|
@ -7563,6 +7947,8 @@ snapshots:
|
|||
has-symbols: 1.1.0
|
||||
isarray: 2.0.5
|
||||
|
||||
safe-buffer@5.2.1: {}
|
||||
|
||||
safe-push-apply@1.0.0:
|
||||
dependencies:
|
||||
es-errors: 1.3.0
|
||||
|
@ -7578,10 +7964,37 @@ snapshots:
|
|||
dependencies:
|
||||
regexp-tree: 0.1.27
|
||||
|
||||
safer-buffer@2.1.2: {}
|
||||
|
||||
semver@6.3.1: {}
|
||||
|
||||
semver@7.7.2: {}
|
||||
|
||||
send@1.2.0:
|
||||
dependencies:
|
||||
debug: 4.4.1(supports-color@10.0.0)
|
||||
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.1
|
||||
ms: 2.1.3
|
||||
on-finished: 2.4.1
|
||||
range-parser: 1.2.1
|
||||
statuses: 2.0.1
|
||||
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-function-length@1.2.2:
|
||||
dependencies:
|
||||
define-data-property: 1.1.4
|
||||
|
@ -7604,6 +8017,8 @@ snapshots:
|
|||
es-errors: 1.3.0
|
||||
es-object-atoms: 1.1.1
|
||||
|
||||
setprototypeof@1.2.0: {}
|
||||
|
||||
sharp@0.33.5:
|
||||
dependencies:
|
||||
color: 4.2.3
|
||||
|
@ -7732,6 +8147,8 @@ snapshots:
|
|||
as-table: 1.0.55
|
||||
get-source: 2.0.12
|
||||
|
||||
statuses@2.0.1: {}
|
||||
|
||||
std-env@3.9.0: {}
|
||||
|
||||
stdin-discarder@0.2.2: {}
|
||||
|
@ -7881,6 +8298,8 @@ snapshots:
|
|||
|
||||
toad-cache@3.7.0: {}
|
||||
|
||||
toidentifier@1.0.1: {}
|
||||
|
||||
toucan-js@4.1.1:
|
||||
dependencies:
|
||||
'@sentry/core': 8.9.2
|
||||
|
@ -7981,6 +8400,12 @@ snapshots:
|
|||
|
||||
type-fest@4.41.0: {}
|
||||
|
||||
type-is@2.0.1:
|
||||
dependencies:
|
||||
content-type: 1.0.5
|
||||
media-typer: 1.1.0
|
||||
mime-types: 3.0.1
|
||||
|
||||
typed-array-buffer@1.0.3:
|
||||
dependencies:
|
||||
call-bound: 1.0.4
|
||||
|
@ -8066,6 +8491,8 @@ snapshots:
|
|||
|
||||
universal-user-agent@7.0.3: {}
|
||||
|
||||
unpipe@1.0.0: {}
|
||||
|
||||
update-browserslist-db@1.1.3(browserslist@4.24.4):
|
||||
dependencies:
|
||||
browserslist: 4.24.4
|
||||
|
@ -8085,6 +8512,8 @@ snapshots:
|
|||
spdx-correct: 3.2.0
|
||||
spdx-expression-parse: 3.0.1
|
||||
|
||||
vary@1.1.2: {}
|
||||
|
||||
vite-node@3.1.4(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.4)(yaml@2.7.1):
|
||||
dependencies:
|
||||
cac: 6.7.14
|
||||
|
@ -8284,6 +8713,8 @@ snapshots:
|
|||
string-width: 7.2.0
|
||||
strip-ansi: 7.1.0
|
||||
|
||||
wrappy@1.0.2: {}
|
||||
|
||||
ws@8.18.0: {}
|
||||
|
||||
xtend@4.0.2: {}
|
||||
|
|
Ładowanie…
Reference in New Issue