From cf4a404fd09d048702c24e83f4c5fae0e17a6968 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 24 Jun 2025 07:34:22 -0500 Subject: [PATCH] feat: add tool-client and search example; refactor e2e --- .../get-deployment-by-identifier.ts | 3 +- .../get-public-deployment-by-identifier.ts | 64 ++ apps/api/src/api-v1/index.ts | 2 + apps/api/src/db/schema/project.ts | 17 +- apps/api/src/db/schema/user.ts | 5 +- .../try-get-deployment-by-identifier.ts | 6 +- apps/e2e/.env.example | 3 + apps/e2e/bin/deploy-fixtures.ts | 8 +- apps/e2e/bin/publish-fixtures.ts | 15 +- apps/e2e/bin/seed-db.ts | 64 +- apps/e2e/src/agentic-examples.ts | 17 + apps/e2e/src/deploy-projects.ts | 30 + apps/e2e/src/{client.ts => dev-client.ts} | 2 +- apps/e2e/src/dev-fixtures.ts | 31 + apps/e2e/src/env.ts | 5 +- apps/e2e/src/project-fixtures.ts | 97 -- apps/e2e/src/publish-deployments.ts | 45 + apps/gateway/package.json | 6 - apps/gateway/src/lib/durable-mcp-client.ts | 2 +- .../src/lib/resolve-origin-tool-call.ts | 2 +- apps/gateway/src/lib/types.ts | 44 - apps/web/.env.example | 3 +- apps/web/package.json | 3 + apps/web/src/app/example-usage.tsx | 202 ++++ apps/web/src/app/page.tsx | 4 +- apps/web/src/components/code-block.tsx | 60 ++ apps/web/src/components/demand-side-cta.tsx | 2 +- apps/web/src/components/ui/tabs.tsx | 66 ++ apps/web/src/lib/config.ts | 3 +- apps/web/src/lib/developer-config.ts | 214 ++++ eslint.config.js | 3 +- examples/search/.dev.vars.example | 3 + examples/search/.env.example | 1 + examples/search/agentic.config.ts | 17 + examples/search/package.json | 32 + examples/search/src/env.ts | 11 + examples/search/src/worker.ts | 80 ++ examples/search/tsconfig.json | 8 + examples/search/wrangler.jsonc | 12 + package.json | 4 +- packages/api-client/src/agentic-api-client.ts | 21 +- packages/platform/package.json | 9 +- packages/tool-client/package.json | 32 + packages/tool-client/readme.md | 23 + .../tool-client/src/agentic-tool-client.ts | 139 +++ packages/tool-client/src/index.ts | 1 + packages/tool-client/tsconfig.json | 5 + packages/types/src/openapi.d.ts | 128 ++- packages/types/src/types.ts | 44 + .../validators/src/namespace-blacklist.ts | 1 - pnpm-lock.yaml | 969 +++++++++++++++++- pnpm-workspace.yaml | 7 +- 52 files changed, 2298 insertions(+), 277 deletions(-) create mode 100644 apps/api/src/api-v1/deployments/get-public-deployment-by-identifier.ts create mode 100644 apps/e2e/src/agentic-examples.ts create mode 100644 apps/e2e/src/deploy-projects.ts rename apps/e2e/src/{client.ts => dev-client.ts} (78%) create mode 100644 apps/e2e/src/dev-fixtures.ts delete mode 100644 apps/e2e/src/project-fixtures.ts create mode 100644 apps/e2e/src/publish-deployments.ts create mode 100644 apps/web/src/app/example-usage.tsx create mode 100644 apps/web/src/components/code-block.tsx create mode 100644 apps/web/src/components/ui/tabs.tsx create mode 100644 apps/web/src/lib/developer-config.ts create mode 100644 examples/search/.dev.vars.example create mode 100644 examples/search/.env.example create mode 100644 examples/search/agentic.config.ts create mode 100644 examples/search/package.json create mode 100644 examples/search/src/env.ts create mode 100644 examples/search/src/worker.ts create mode 100644 examples/search/tsconfig.json create mode 100644 examples/search/wrangler.jsonc create mode 100644 packages/tool-client/package.json create mode 100644 packages/tool-client/readme.md create mode 100644 packages/tool-client/src/agentic-tool-client.ts create mode 100644 packages/tool-client/src/index.ts create mode 100644 packages/tool-client/tsconfig.json diff --git a/apps/api/src/api-v1/deployments/get-deployment-by-identifier.ts b/apps/api/src/api-v1/deployments/get-deployment-by-identifier.ts index bf56e39d..b7bc3b09 100644 --- a/apps/api/src/api-v1/deployments/get-deployment-by-identifier.ts +++ b/apps/api/src/api-v1/deployments/get-deployment-by-identifier.ts @@ -14,7 +14,8 @@ import { import { deploymentIdentifierAndPopulateSchema } from './schemas' const route = createRoute({ - description: 'Gets a deployment by its public identifier', + description: + 'Gets a deployment by its identifier (eg, "@username/project-name@latest").', tags: ['deployments'], operationId: 'getDeploymentByIdentifier', method: 'get', diff --git a/apps/api/src/api-v1/deployments/get-public-deployment-by-identifier.ts b/apps/api/src/api-v1/deployments/get-public-deployment-by-identifier.ts new file mode 100644 index 00000000..4770eda0 --- /dev/null +++ b/apps/api/src/api-v1/deployments/get-public-deployment-by-identifier.ts @@ -0,0 +1,64 @@ +import type { DefaultHonoEnv } from '@agentic/platform-hono' +import { assert, parseZodSchema } from '@agentic/platform-core' +import { createRoute, type OpenAPIHono } from '@hono/zod-openapi' + +import { schema } from '@/db' +import { aclPublicProject } from '@/lib/acl-public-project' +import { tryGetDeploymentByIdentifier } from '@/lib/deployments/try-get-deployment-by-identifier' +import { + openapiAuthenticatedSecuritySchemas, + openapiErrorResponse404, + openapiErrorResponses +} from '@/lib/openapi-utils' + +import { deploymentIdentifierAndPopulateSchema } from './schemas' + +const route = createRoute({ + description: + 'Gets a public deployment by its identifier (eg, "@username/project-name@latest").', + tags: ['deployments'], + operationId: 'getPublicDeploymentByIdentifier', + method: 'get', + path: 'deployments/public/by-identifier', + security: openapiAuthenticatedSecuritySchemas, + request: { + query: deploymentIdentifierAndPopulateSchema + }, + responses: { + 200: { + description: 'A deployment object', + content: { + 'application/json': { + schema: schema.deploymentSelectSchema + } + } + }, + ...openapiErrorResponses, + ...openapiErrorResponse404 + } +}) + +export function registerV1GetPublicDeploymentByIdentifier( + app: OpenAPIHono +) { + return app.openapi(route, async (c) => { + const { deploymentIdentifier, populate = [] } = c.req.valid('query') + + const deployment = await tryGetDeploymentByIdentifier(c, { + deploymentIdentifier, + with: { + project: true, + ...Object.fromEntries(populate.map((field) => [field, true])) + } + }) + assert(deployment, 404, `Deployment not found "${deploymentIdentifier}"`) + assert( + deployment.project, + 404, + `Project not found for deployment "${deploymentIdentifier}"` + ) + await aclPublicProject(deployment.project!) + + return c.json(parseZodSchema(schema.deploymentSelectSchema, deployment)) + }) +} diff --git a/apps/api/src/api-v1/index.ts b/apps/api/src/api-v1/index.ts index cce4e8db..2993f9e4 100644 --- a/apps/api/src/api-v1/index.ts +++ b/apps/api/src/api-v1/index.ts @@ -27,6 +27,7 @@ import { registerV1AdminGetDeploymentByIdentifier } from './deployments/admin-ge import { registerV1CreateDeployment } from './deployments/create-deployment' import { registerV1GetDeployment } from './deployments/get-deployment' import { registerV1GetDeploymentByIdentifier } from './deployments/get-deployment-by-identifier' +import { registerV1GetPublicDeploymentByIdentifier } from './deployments/get-public-deployment-by-identifier' import { registerV1ListDeployments } from './deployments/list-deployments' import { registerV1PublishDeployment } from './deployments/publish-deployment' import { registerV1UpdateDeployment } from './deployments/update-deployment' @@ -133,6 +134,7 @@ registerV1ListConsumers(privateRouter) registerV1ListConsumersForProject(privateRouter) // Deployments +registerV1GetPublicDeploymentByIdentifier(publicRouter) registerV1GetDeploymentByIdentifier(privateRouter) // must be before `registerV1GetDeployment` registerV1GetDeployment(privateRouter) registerV1CreateDeployment(privateRouter) diff --git a/apps/api/src/db/schema/project.ts b/apps/api/src/db/schema/project.ts index 2647dc6e..a1ff7a26 100644 --- a/apps/api/src/db/schema/project.ts +++ b/apps/api/src/db/schema/project.ts @@ -248,9 +248,23 @@ export const projectSelectSchema = createSelectSchema(projects, { return deploymentSelectSchema.parse(deployment) }) .optional(), - // .openapi('Deployment', { type: 'object' }), lastDeployment: z + .any() + .refine( + (deployment): boolean => + !deployment || deploymentSelectSchema.safeParse(deployment).success, + { + message: 'Invalid lastDeployment' + } + ) + .transform((deployment): any => { + if (!deployment) return undefined + return deploymentSelectSchema.parse(deployment) + }) + .optional(), + + deployment: z .any() .refine( (deployment): boolean => @@ -264,7 +278,6 @@ export const projectSelectSchema = createSelectSchema(projects, { return deploymentSelectSchema.parse(deployment) }) .optional() - // .openapi('Deployment', { type: 'object' }) }) .strip() // TODO diff --git a/apps/api/src/db/schema/user.ts b/apps/api/src/db/schema/user.ts index 663fbf33..9e82d316 100644 --- a/apps/api/src/db/schema/user.ts +++ b/apps/api/src/db/schema/user.ts @@ -28,9 +28,11 @@ export const users = pgTable( username: username().unique().notNull(), role: userRoleEnum().default('user').notNull(), - name: text(), email: text().notNull().unique(), isEmailVerified: boolean().default(false).notNull(), + + name: text(), + bio: text(), image: text(), //isStripeConnectEnabledByDefault: boolean().default(true).notNull(), @@ -57,6 +59,7 @@ export const userSelectSchema = createSelectSchema(users) export const userUpdateSchema = createUpdateSchema(users) .pick({ name: true, + bio: true, image: true //isStripeConnectEnabledByDefault: true }) diff --git a/apps/api/src/lib/deployments/try-get-deployment-by-identifier.ts b/apps/api/src/lib/deployments/try-get-deployment-by-identifier.ts index 2a4292ee..ed4490a8 100644 --- a/apps/api/src/lib/deployments/try-get-deployment-by-identifier.ts +++ b/apps/api/src/lib/deployments/try-get-deployment-by-identifier.ts @@ -1,7 +1,7 @@ +import type { DefaultHonoContext } from '@agentic/platform-hono' import { assert } from '@agentic/platform-core' import { parseDeploymentIdentifier } from '@agentic/platform-validators' -import type { AuthenticatedHonoContext } from '@/lib/types' import { and, db, @@ -12,6 +12,8 @@ import { } from '@/db' import { setPublicCacheControl } from '@/lib/cache-control' +import type { AuthenticatedHonoContext } from '../types' + /** * Attempts to find the Deployment matching the given deployment ID or * identifier. @@ -21,7 +23,7 @@ import { setPublicCacheControl } from '@/lib/cache-control' * Does not take care of ACLs. */ export async function tryGetDeploymentByIdentifier( - ctx: AuthenticatedHonoContext, + ctx: AuthenticatedHonoContext | DefaultHonoContext, { deploymentIdentifier, strict = false, diff --git a/apps/e2e/.env.example b/apps/e2e/.env.example index 869fb64a..eb1bcb87 100644 --- a/apps/e2e/.env.example +++ b/apps/e2e/.env.example @@ -13,3 +13,6 @@ AGENTIC_GATEWAY_BASE_URL='http://localhost:8787' AGENTIC_DEV_EMAIL= AGENTIC_DEV_PASSWORD= AGENTIC_DEV_ACCESS_TOKEN= + +AGENTIC_AGENTIC_EMAIL= +AGENTIC_AGENTIC_PASSWORD= diff --git a/apps/e2e/bin/deploy-fixtures.ts b/apps/e2e/bin/deploy-fixtures.ts index e15a02e7..43d6c6c2 100644 --- a/apps/e2e/bin/deploy-fixtures.ts +++ b/apps/e2e/bin/deploy-fixtures.ts @@ -1,9 +1,11 @@ -import { deployFixtures } from '../src/project-fixtures' +import { deployProjects } from '../src/deploy-projects' +import { devClient } from '../src/dev-client' +import { fixtures } from '../src/dev-fixtures' async function main() { - console.log('\n\nDeploying fixtures...\n\n') + console.log('\n\nDeploying dev fixtures...\n\n') - const deployments = await deployFixtures() + const deployments = await deployProjects(fixtures, { client: devClient }) console.log(JSON.stringify(deployments, null, 2)) // eslint-disable-next-line unicorn/no-process-exit diff --git a/apps/e2e/bin/publish-fixtures.ts b/apps/e2e/bin/publish-fixtures.ts index 37cbe3d1..770a1a67 100644 --- a/apps/e2e/bin/publish-fixtures.ts +++ b/apps/e2e/bin/publish-fixtures.ts @@ -1,14 +1,19 @@ -import { deployFixtures, publishDeployments } from '../src/project-fixtures' +import { deployProjects } from '../src/deploy-projects' +import { devClient } from '../src/dev-client' +import { fixtures } from '../src/dev-fixtures' +import { publishDeployments } from '../src/publish-deployments' async function main() { - console.log('\n\nDeploying fixtures...\n\n') + console.log('\n\nDeploying dev fixtures...\n\n') - const deployments = await deployFixtures() + const deployments = await deployProjects(fixtures, { client: devClient }) console.log(JSON.stringify(deployments, null, 2)) - console.log('\n\nPublishing deployments...\n\n') + console.log('\n\nPublishing dev fixture deployments...\n\n') - const publishedDeployments = await publishDeployments(deployments) + const publishedDeployments = await publishDeployments(deployments, { + client: devClient + }) console.log(JSON.stringify(publishedDeployments, null, 2)) // eslint-disable-next-line unicorn/no-process-exit diff --git a/apps/e2e/bin/seed-db.ts b/apps/e2e/bin/seed-db.ts index 727ce315..fa6d8c6a 100644 --- a/apps/e2e/bin/seed-db.ts +++ b/apps/e2e/bin/seed-db.ts @@ -1,7 +1,10 @@ import { AgenticApiClient } from '@agentic/platform-api-client' +import { examples } from '../src/agentic-examples' +import { deployProjects } from '../src/deploy-projects' +import { fixtures } from '../src/dev-fixtures' import { env, isProd } from '../src/env' -import { deployFixtures, publishDeployments } from '../src/project-fixtures' +import { publishDeployments } from '../src/publish-deployments' export const client = new AgenticApiClient({ apiBaseUrl: env.AGENTIC_API_BASE_URL @@ -10,28 +13,55 @@ export const client = new AgenticApiClient({ async function main() { // TODO: clear existing tables? and include prompt to double check if so... - console.log('\n\nCreating dev user...\n\n') + { + console.log('\n\nCreating "dev" user...\n\n') - const devAuthSession = await client.signUpWithPassword({ - username: 'dev', - email: env.AGENTIC_DEV_EMAIL, - password: env.AGENTIC_DEV_PASSWORD - }) - console.log(JSON.stringify(devAuthSession, null, 2)) + const devAuthSession = await client.signUpWithPassword({ + username: 'dev', + email: env.AGENTIC_DEV_EMAIL, + password: env.AGENTIC_DEV_PASSWORD + }) + console.log(JSON.stringify(devAuthSession, null, 2)) - console.warn( - `\n\nREMEMBER TO UPDATE "AGENTIC_DEV_ACCESS_TOKEN" in e2e/.env${isProd ? '.production' : ''}\n\n` - ) + console.warn( + `\n\nREMEMBER TO UPDATE "AGENTIC_DEV_ACCESS_TOKEN" in e2e/.env${isProd ? '.production' : ''}\n\n` + ) - console.log('\n\nDeploying fixtures...\n\n') + console.log('\n\nDeploying dev fixtures...\n\n') - const deployments = await deployFixtures() - console.log(JSON.stringify(deployments, null, 2)) + const deployments = await deployProjects(fixtures, { client }) + console.log(JSON.stringify(deployments, null, 2)) - console.log('\n\nPublishing deployments...\n\n') + console.log('\n\nPublishing dev fixture deployments...\n\n') - const publishedDeployments = await publishDeployments(deployments) - console.log(JSON.stringify(publishedDeployments, null, 2)) + const publishedDeployments = await publishDeployments(deployments, { + client + }) + console.log(JSON.stringify(publishedDeployments, null, 2)) + } + + { + console.log('\n\nCreating "agentic" user...\n\n') + + const agenticAuthSession = await client.signUpWithPassword({ + username: 'agentic', + email: env.AGENTIC_AGENTIC_EMAIL, + password: env.AGENTIC_AGENTIC_PASSWORD + }) + console.log(JSON.stringify(agenticAuthSession, null, 2)) + + console.log('\n\nDeploying example projects...\n\n') + + const deployments = await deployProjects(examples, { client }) + console.log(JSON.stringify(deployments, null, 2)) + + console.log('\n\nPublishing example project deployments...\n\n') + + const publishedDeployments = await publishDeployments(deployments, { + client + }) + console.log(JSON.stringify(publishedDeployments, null, 2)) + } // eslint-disable-next-line unicorn/no-process-exit process.exit(0) diff --git a/apps/e2e/src/agentic-examples.ts b/apps/e2e/src/agentic-examples.ts new file mode 100644 index 00000000..6d77cd49 --- /dev/null +++ b/apps/e2e/src/agentic-examples.ts @@ -0,0 +1,17 @@ +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const exampleProjectNames = ['search'] + +const examplesDir = path.join( + fileURLToPath(import.meta.url), + '..', + '..', + '..', + '..', + 'examples' +) + +export const examples = exampleProjectNames.map((name) => + path.join(examplesDir, name) +) diff --git a/apps/e2e/src/deploy-projects.ts b/apps/e2e/src/deploy-projects.ts new file mode 100644 index 00000000..e5ccb14c --- /dev/null +++ b/apps/e2e/src/deploy-projects.ts @@ -0,0 +1,30 @@ +import type { AgenticApiClient } from '@agentic/platform-api-client' +import { loadAgenticConfig } from '@agentic/platform' +import pMap from 'p-map' + +export async function deployProjects( + projects: string[], + { + client, + concurrency = 1 + }: { + client: AgenticApiClient + concurrency?: number + } +) { + const deployments = await pMap( + projects, + async (project) => { + const config = await loadAgenticConfig({ cwd: project }) + const deployment = await client.createDeployment(config) + console.log(`Deployed ${project} => ${deployment.identifier}`) + + return deployment + }, + { + concurrency + } + ) + + return deployments +} diff --git a/apps/e2e/src/client.ts b/apps/e2e/src/dev-client.ts similarity index 78% rename from apps/e2e/src/client.ts rename to apps/e2e/src/dev-client.ts index aef6f816..e6c0d08b 100644 --- a/apps/e2e/src/client.ts +++ b/apps/e2e/src/dev-client.ts @@ -2,7 +2,7 @@ import { AgenticApiClient } from '@agentic/platform-api-client' import { env } from './env' -export const client = new AgenticApiClient({ +export const devClient = new AgenticApiClient({ apiBaseUrl: env.AGENTIC_API_BASE_URL, apiKey: env.AGENTIC_DEV_ACCESS_TOKEN }) diff --git a/apps/e2e/src/dev-fixtures.ts b/apps/e2e/src/dev-fixtures.ts new file mode 100644 index 00000000..d6f1b90a --- /dev/null +++ b/apps/e2e/src/dev-fixtures.ts @@ -0,0 +1,31 @@ +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const fixtureNames = [ + // TODO: re-add these + // 'basic-raw-free-ts', + // 'basic-raw-free-json', + // 'pricing-freemium', + // 'pricing-pay-as-you-go', + // 'pricing-3-plans', + // 'pricing-monthly-annual', + // 'pricing-custom-0', + 'basic-openapi', + 'basic-mcp', + 'everything-openapi' +] + +const fixturesDir = path.join( + fileURLToPath(import.meta.url), + '..', + '..', + '..', + '..', + 'packages', + 'fixtures' +) +const validFixturesDir = path.join(fixturesDir, 'valid') + +export const fixtures = fixtureNames.map((name) => + path.join(validFixturesDir, name) +) diff --git a/apps/e2e/src/env.ts b/apps/e2e/src/env.ts index 54e663cb..2a894dd6 100644 --- a/apps/e2e/src/env.ts +++ b/apps/e2e/src/env.ts @@ -14,9 +14,12 @@ export const envSchema = z.object({ AGENTIC_API_BASE_URL: z.string().url().optional(), - AGENTIC_DEV_ACCESS_TOKEN: z.string().nonempty(), AGENTIC_DEV_EMAIL: z.string().email(), AGENTIC_DEV_PASSWORD: z.string().nonempty(), + AGENTIC_DEV_ACCESS_TOKEN: z.string().nonempty(), + + AGENTIC_AGENTIC_EMAIL: z.string().email(), + AGENTIC_AGENTIC_PASSWORD: z.string().nonempty(), AGENTIC_GATEWAY_BASE_URL: z .string() diff --git a/apps/e2e/src/project-fixtures.ts b/apps/e2e/src/project-fixtures.ts deleted file mode 100644 index 1700c029..00000000 --- a/apps/e2e/src/project-fixtures.ts +++ /dev/null @@ -1,97 +0,0 @@ -import path from 'node:path' -import { fileURLToPath } from 'node:url' - -import type { Deployment } from '@agentic/platform-types' -import { loadAgenticConfig } from '@agentic/platform' -import { assert } from '@agentic/platform-core' -import pMap from 'p-map' -import semver from 'semver' - -import { client } from './client' - -const fixtures = [ - // TODO: re-add these - // 'basic-raw-free-ts', - // 'basic-raw-free-json', - // 'pricing-freemium', - // 'pricing-pay-as-you-go', - // 'pricing-3-plans', - // 'pricing-monthly-annual', - // 'pricing-custom-0', - 'basic-openapi', - 'basic-mcp', - 'everything-openapi' -] - -const fixturesDir = path.join( - fileURLToPath(import.meta.url), - '..', - '..', - '..', - '..', - 'packages', - 'fixtures' -) -const validFixturesDir = path.join(fixturesDir, 'valid') - -export async function deployFixtures({ - concurrency = 1 -}: { - concurrency?: number -} = {}) { - const deployments = await pMap( - fixtures, - async (fixture) => { - const fixtureDir = path.join(validFixturesDir, fixture) - - const config = await loadAgenticConfig({ cwd: fixtureDir }) - const deployment = await client.createDeployment(config) - console.log(`Deployed ${fixture} => ${deployment.identifier}`) - - return deployment - }, - { - concurrency - } - ) - - return deployments -} - -export async function publishDeployments( - deployments: Deployment[], - { - concurrency = 1 - }: { - concurrency?: number - } = {} -) { - const publishedDeployments = await pMap( - deployments, - async (deployment) => { - const project = await client.getProject({ - projectId: deployment.projectId, - populate: ['lastDeployment'] - }) - - const baseVersion = project.lastPublishedDeploymentVersion || '0.0.0' - const version = semver.inc(baseVersion, 'patch') - assert(version, `Failed to increment deployment version "${baseVersion}"`) - - const publishedDeployment = await client.publishDeployment( - { version }, - { - deploymentId: deployment.id - } - ) - console.log(`Published ${deployment.identifier} => ${version}`) - - return publishedDeployment - }, - { - concurrency - } - ) - - return publishedDeployments -} diff --git a/apps/e2e/src/publish-deployments.ts b/apps/e2e/src/publish-deployments.ts new file mode 100644 index 00000000..b4b989e5 --- /dev/null +++ b/apps/e2e/src/publish-deployments.ts @@ -0,0 +1,45 @@ +import type { AgenticApiClient } from '@agentic/platform-api-client' +import type { Deployment } from '@agentic/platform-types' +import { assert } from '@agentic/platform-core' +import pMap from 'p-map' +import semver from 'semver' + +export async function publishDeployments( + deployments: Deployment[], + { + client, + concurrency = 1 + }: { + client: AgenticApiClient + concurrency?: number + } +) { + const publishedDeployments = await pMap( + deployments, + async (deployment) => { + const project = await client.getProject({ + projectId: deployment.projectId, + populate: ['lastDeployment'] + }) + + const baseVersion = project.lastPublishedDeploymentVersion || '0.0.0' + const version = semver.inc(baseVersion, 'patch') + assert(version, `Failed to increment deployment version "${baseVersion}"`) + + const publishedDeployment = await client.publishDeployment( + { version }, + { + deploymentId: deployment.id + } + ) + console.log(`Published ${deployment.identifier} => ${version}`) + + return publishedDeployment + }, + { + concurrency + } + ) + + return publishedDeployments +} diff --git a/apps/gateway/package.json b/apps/gateway/package.json index 2e271dee..920fbb87 100644 --- a/apps/gateway/package.json +++ b/apps/gateway/package.json @@ -12,11 +12,6 @@ }, "type": "module", "source": "./src/worker.ts", - "exports": { - ".": { - "import": "./src/worker.ts" - } - }, "scripts": { "deploy": "wrangler deploy --outdir dist --upload-source-maps --var SENTRY_RELEASE:$(sentry-cli releases propose-version)", "dev": "wrangler dev", @@ -35,7 +30,6 @@ "@agentic/platform-hono": "workspace:*", "@agentic/platform-types": "workspace:*", "@agentic/platform-validators": "workspace:*", - "@cloudflare/workers-oauth-provider": "^0.0.5", "@hono/zod-validator": "catalog:", "@modelcontextprotocol/sdk": "catalog:", "@sentry/cloudflare": "catalog:", diff --git a/apps/gateway/src/lib/durable-mcp-client.ts b/apps/gateway/src/lib/durable-mcp-client.ts index 008fca44..c156fa6a 100644 --- a/apps/gateway/src/lib/durable-mcp-client.ts +++ b/apps/gateway/src/lib/durable-mcp-client.ts @@ -1,3 +1,4 @@ +import type { AgenticMcpRequestMetadata } from '@agentic/platform-types' import { assert } from '@agentic/platform-core' import { Client as McpClient } from '@modelcontextprotocol/sdk/client/index.js' import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js' @@ -5,7 +6,6 @@ import * as Sentry from '@sentry/cloudflare' import { DurableObject } from 'cloudflare:workers' import type { RawEnv } from './env' -import type { AgenticMcpRequestMetadata } from './types' export type DurableMcpClientInfo = { url: string diff --git a/apps/gateway/src/lib/resolve-origin-tool-call.ts b/apps/gateway/src/lib/resolve-origin-tool-call.ts index 42730c30..1764da02 100644 --- a/apps/gateway/src/lib/resolve-origin-tool-call.ts +++ b/apps/gateway/src/lib/resolve-origin-tool-call.ts @@ -1,5 +1,6 @@ import type { AdminDeployment, + AgenticMcpRequestMetadata, PricingPlan, Tool } from '@agentic/platform-types' @@ -11,7 +12,6 @@ import type { DurableMcpClientBase } from './durable-mcp-client' import type { RawEnv } from './env' import type { AdminConsumer, - AgenticMcpRequestMetadata, CacheStatus, McpToolCallResponse, RateLimitResult, diff --git a/apps/gateway/src/lib/types.ts b/apps/gateway/src/lib/types.ts index c2e3b5e9..bf755ff4 100644 --- a/apps/gateway/src/lib/types.ts +++ b/apps/gateway/src/lib/types.ts @@ -112,47 +112,3 @@ export type ResolvedOriginToolCallResult = { toolCallResponse: McpToolCallResponse } ) - -export type AgenticMcpRequestMetadata = { - agenticProxySecret: string - sessionId: string - isCustomerSubscriptionActive: boolean - - customerId?: string - customerSubscriptionStatus?: string - customerSubscriptionPlan?: string - - userId?: string - userEmail?: string - userUsername?: string - userName?: string - userCreatedAt?: string - userUpdatedAt?: string - - deploymentId: string - deploymentIdentifier: string - projectId: string - projectIdentifier: string - - ip?: string -} & ( - | { - // If the customer has an active subscription, these fields are guaranteed - // to be present in the metadata. - isCustomerSubscriptionActive: true - - customerId: string - customerSubscriptionStatus: string - - userId: string - userEmail: string - userUsername: string - userCreatedAt: string - userUpdatedAt: string - } - | { - // If the customer does not have an active subscription, then the customer - // fields may or may not be present. - isCustomerSubscriptionActive: false - } -) diff --git a/apps/web/.env.example b/apps/web/.env.example index cf63f458..5527c69d 100644 --- a/apps/web/.env.example +++ b/apps/web/.env.example @@ -1,4 +1,5 @@ -NEXT_PUBLIC_API_BASE_URL= +NEXT_PUBLIC_AGENTIC_API_BASE_URL= +NEXT_PUBLIC_AGENTIC_GATEWAY_BASE_URL= NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= STRIPE_SECRET_KEY= diff --git a/apps/web/package.json b/apps/web/package.json index a76d7622..ea1d6cc2 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -30,6 +30,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.12", "@radix-ui/react-tooltip": "^1.2.7", "@react-three/cannon": "^6.6.0", "@react-three/drei": "^10.2.0", @@ -43,6 +44,7 @@ "canvas-confetti": "^1.9.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "hast-util-to-jsx-runtime": "^2.3.6", "ky": "catalog:", "lucide-react": "^0.518.0", "motion": "^12.18.1", @@ -54,6 +56,7 @@ "react-infinite-scroll-hook": "^6.0.1", "react-lottie-player": "^2.1.0", "react-use": "^17.6.0", + "shiki": "^3.7.0", "sonner": "^2.0.5", "stripe": "catalog:", "suspend-react": "^0.1.3", diff --git a/apps/web/src/app/example-usage.tsx b/apps/web/src/app/example-usage.tsx new file mode 100644 index 00000000..8cc0c6ff --- /dev/null +++ b/apps/web/src/app/example-usage.tsx @@ -0,0 +1,202 @@ +'use client' + +import { useLocalStorage } from 'react-use' + +import { CodeBlock } from '@/components/code-block' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { + defaultConfig, + type DeveloperConfig, + type HTTPTarget, + httpTargetLabels, + httpTargets, + type MCPClientTarget, + mcpClientTargetLabels, + mcpClientTargets, + type PyFrameworkTarget, + pyFrameworkTargetLabels, + pyFrameworkTargets, + type Target, + targetLabels, + targets, + type TsFrameworkTarget, + tsFrameworkTargetLabels, + tsFrameworkTargets +} from '@/lib/developer-config' + +export function ExampleUsage() { + const [config, setConfig] = useLocalStorage( + 'config', + defaultConfig + ) + + return ( + + setConfig({ + ...defaultConfig, + ...config, + target: value as Target + }) + } + className='w-full max-w-2xl' + > + + {targets.map((target) => ( + + {targetLabels[target]} + + ))} + + + + + setConfig({ + ...defaultConfig, + ...config, + mcpClientTarget: value as MCPClientTarget + }) + } + className='w-full' + > + + {mcpClientTargets.map((mcpClientTarget) => ( + + {mcpClientTargetLabels[mcpClientTarget]} + + ))} + + + {mcpClientTargets.map((mcpClientTarget) => ( + + + + ))} + + + + + + setConfig({ + ...defaultConfig, + ...config, + tsFrameworkTarget: value as TsFrameworkTarget + }) + } + className='w-full' + > + + {tsFrameworkTargets.map((framework) => ( + + {tsFrameworkTargetLabels[framework]} + + ))} + + + {tsFrameworkTargets.map((framework) => ( + + + + ))} + + + + + + setConfig({ + ...defaultConfig, + ...config, + pyFrameworkTarget: value as PyFrameworkTarget + }) + } + className='w-full' + > + + {pyFrameworkTargets.map((framework) => ( + + {pyFrameworkTargetLabels[framework]} + + ))} + + + {pyFrameworkTargets.map((framework) => ( + + + + ))} + + + + + + setConfig({ + ...defaultConfig, + ...config, + httpTarget: value as HTTPTarget + }) + } + className='w-full' + > + + {httpTargets.map((httpTarget) => ( + + {httpTargetLabels[httpTarget]} + + ))} + + + {httpTargets.map((httpTarget) => ( + + + + ))} + + + + ) +} diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index d66dad40..4fb03037 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -4,6 +4,8 @@ import { DemandSideCTA } from '@/components/demand-side-cta' import { GitHubStarCounter } from '@/components/github-star-counter' import { githubUrl, twitterUrl } from '@/lib/config' +import { ExampleUsage } from './example-usage' + export default function TheBestDamnLandingPageEver() { return ( <> @@ -35,7 +37,7 @@ export default function TheBestDamnLandingPageEver() { How It Works -
TODO
+ {/* Marketplace section */} diff --git a/apps/web/src/components/code-block.tsx b/apps/web/src/components/code-block.tsx new file mode 100644 index 00000000..79018b40 --- /dev/null +++ b/apps/web/src/components/code-block.tsx @@ -0,0 +1,60 @@ +import { toJsxRuntime } from 'hast-util-to-jsx-runtime' +import { Fragment, type JSX, useEffect, useState } from 'react' +import { jsx, jsxs } from 'react/jsx-runtime' +import { type BundledLanguage, codeToHast } from 'shiki/bundle/web' + +import { LoadingIndicator } from './loading-indicator' + +export async function highlight({ + code, + lang = 'ts', + theme = 'github-dark', + className +}: { + code: string + lang?: BundledLanguage + theme?: string + className?: string +}) { + const out = await codeToHast(code, { + lang, + theme, + transformers: [ + { + pre(node) { + if (className) { + this.addClassToHast(node, className) + } + } + } + ] + }) + + return toJsxRuntime(out, { + Fragment, + jsx, + jsxs + }) as JSX.Element +} + +export function CodeBlock({ + initial, + code, + lang, + theme, + className +}: { + initial?: JSX.Element + code: string + lang?: BundledLanguage + theme?: string + className?: string +}) { + const [nodes, setNodes] = useState(initial) + + useEffect(() => { + void highlight({ code, lang, theme, className }).then(setNodes) + }, [code, lang, theme, className]) + + return nodes ?? +} diff --git a/apps/web/src/components/demand-side-cta.tsx b/apps/web/src/components/demand-side-cta.tsx index 90d94654..3c3a6eb3 100644 --- a/apps/web/src/components/demand-side-cta.tsx +++ b/apps/web/src/components/demand-side-cta.tsx @@ -15,7 +15,7 @@ export function DemandSideCTA() { diff --git a/apps/web/src/components/ui/tabs.tsx b/apps/web/src/components/ui/tabs.tsx new file mode 100644 index 00000000..c6bfb984 --- /dev/null +++ b/apps/web/src/components/ui/tabs.tsx @@ -0,0 +1,66 @@ +'use client' + +import * as TabsPrimitive from '@radix-ui/react-tabs' +import * as React from 'react' + +import { cn } from '@/lib/utils' + +function Tabs({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsList({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsTrigger({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Tabs, TabsContent,TabsList, TabsTrigger } diff --git a/apps/web/src/lib/config.ts b/apps/web/src/lib/config.ts index 499b044d..ed4e4cf7 100644 --- a/apps/web/src/lib/config.ts +++ b/apps/web/src/lib/config.ts @@ -59,7 +59,8 @@ export const url = isDev ? `http://localhost:${port}` : prodUrl export const vercelUrl = process.env.VERCEL_URL ?? process.env.NEXT_PUBLIC_VERCEL_URL // export const webBaseUrl = isDev || !vercelUrl ? url : `https://${vercelUrl}` -export const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL! +export const apiBaseUrl = process.env.NEXT_PUBLIC_AGENTIC_API_BASE_URL! +export const gatewayBaseUrl = process.env.NEXT_PUBLIC_AGENTIC_GATEWAY_BASE_URL! export const posthogKey = process.env.NEXT_PUBLIC_POSTHOG_KEY! export const posthogHost = diff --git a/apps/web/src/lib/developer-config.ts b/apps/web/src/lib/developer-config.ts new file mode 100644 index 00000000..0310189a --- /dev/null +++ b/apps/web/src/lib/developer-config.ts @@ -0,0 +1,214 @@ +import type { Deployment, Project } from '@agentic/platform-types' +import { assert } from '@agentic/platform-core' + +import { gatewayBaseUrl } from './config' + +export const targetLabels = { + mcp: 'MCP', + typescript: 'TypeScript', + python: 'Python', + http: 'HTTP' +} as const +export const targets: (keyof typeof targetLabels)[] = Object.keys( + targetLabels +) as any +export type Target = (typeof targets)[number] + +export const httpTargetLabels = { + curl: 'cURL', + httpie: 'HTTPie' +} as const +export const httpTargets: (keyof typeof httpTargetLabels)[] = Object.keys( + httpTargetLabels +) as any +export type HTTPTarget = (typeof httpTargets)[number] + +export const mcpClientTargetLabels = { + any: 'Any MCP Client', + 'claude-desktop': 'Claude Desktop', + raycast: 'Raycast', + cursor: 'Cursor', + windsurf: 'Windsurf', + cline: 'Cline', + goose: 'Goose' +} as const +export const mcpClientTargets: (keyof typeof mcpClientTargetLabels)[] = + Object.keys(mcpClientTargetLabels) as any +export type MCPClientTarget = (typeof mcpClientTargets)[number] + +export const tsFrameworkTargetLabels = { + ai: 'Vercel AI SDK', + 'openai-chat': 'OpenAI Chat', + 'openai-responses': 'OpenAI Responses', + langchain: 'LangChain', + mastra: 'Mastra', + llamaindex: 'LlamaIndex', + 'firebase-genkit': 'Firebase GenKit', + xsai: 'xsAI' +} as const +export const tsFrameworkTargets: (keyof typeof tsFrameworkTargetLabels)[] = + Object.keys(tsFrameworkTargetLabels) as any +export type TsFrameworkTarget = (typeof tsFrameworkTargets)[number] + +export const pyFrameworkTargetLabels = { + openai: 'OpenAI', + langchain: 'LangChain', + llamaindex: 'LlamaIndex' +} as const +export const pyFrameworkTargets: (keyof typeof pyFrameworkTargetLabels)[] = + Object.keys(pyFrameworkTargetLabels) as any +export type PyFrameworkTarget = (typeof pyFrameworkTargets)[number] + +export type DeveloperConfig = { + target: Target + mcpClientTarget: MCPClientTarget + tsFrameworkTarget: TsFrameworkTarget + pyFrameworkTarget: PyFrameworkTarget + httpTarget: HTTPTarget +} + +export const defaultConfig: DeveloperConfig = { + target: 'typescript', + mcpClientTarget: 'any', + tsFrameworkTarget: 'ai', + pyFrameworkTarget: 'openai', + httpTarget: 'curl' +} + +export function getCodeForDeveloperConfig(opts: { + config: DeveloperConfig + project: Project + deployment: Deployment + identifier: string + tool?: string +}): string { + const { config } = opts + + switch (config.target) { + case 'mcp': + return getCodeForMCPClientConfig(opts) + case 'typescript': + return getCodeForTSFrameworkConfig(opts) + case 'python': + return 'Python support is coming soon...' + // return getCodeForPythonFrameworkConfig(opts) + case 'http': + return getCodeForHTTPConfig(opts) + } +} + +export function getCodeForMCPClientConfig({ + identifier +}: { + identifier: string +}): string { + return `${gatewayBaseUrl}/${identifier}/mcp` +} + +export function getCodeForTSFrameworkConfig({ + config, + identifier +}: { + config: DeveloperConfig + identifier: string +}): string { + switch (config.tsFrameworkTarget) { + case 'ai': + return ` +import { createAISDKTools } from '@agentic/ai' +import { AgenticToolClient } from '@agentic/platform-tool-client' +import { openai } from '@ai-sdk/openai' +import { generateText } from 'ai' + +const searchTool = await AgenticToolClient.fromIdentifier('${identifier}') + +const result = await generateText({ + model: openai('gpt-4o-mini'), + tools: createAISDKTools(searchTool), + toolChoice: 'required', + temperature: 0, + system: 'You are a helpful assistant. Be as concise as possible.', + prompt: 'What is the latest news about AI?' +}) + +console.log(result.toolResults[0]) + `.trim() + + case 'openai-chat': + return ` +import { AgenticToolClient } from '@agentic/platform-tool-client' +import OpenAI from 'openai' + +const openai = new OpenAI() +const searchTool = await AgenticToolClient.fromIdentifier('${identifier}') + +const res = await openai.chat.completions.create({ + messages: [ + { + role: 'system', + content: 'You are a helpful assistant. Be as concise as possible.' + } + { + role: 'user', + content: 'What is the latest news about AI?' + } + ], + model: 'gpt-4o-mini', + temperature: 0, + tools: searchTool.functions.toolSpecs, + tool_choice: 'required' +}) + +const message = res.choices[0]!.message! +const toolCall = message.tool_calls![0]! + +const tool = searchTool.functions.get(toolCall.function.name)! +const toolResult = await tool(toolCall.function.arguments) + +console.log(toolResult) +`.trim() + } + + return '' +} + +// export function getCodeForPythonFrameworkConfig({ +// config, +// project, +// deployment, +// tool +// }: { +// config: DeveloperConfig +// project: Project +// deployment: Deployment +// identifier: string +// tool?: string +// }): string { +// return '' +// } + +export function getCodeForHTTPConfig({ + config, + identifier, + deployment, + tool +}: { + config: DeveloperConfig + deployment: Deployment + identifier: string + tool?: string +}): string { + tool ??= deployment.tools[0]?.name + assert(tool, 'tool is required') + // TODO: need a way of getting example tool args + + const url = `${gatewayBaseUrl}/${identifier}/${tool}` + + switch (config.httpTarget) { + case 'curl': + return `curl -X POST -H "Content-Type: application/json" -d '{"query": "example google search"}' ${url}` + + case 'httpie': + return `http -j ${url} query='example google search'` + } +} diff --git a/eslint.config.js b/eslint.config.js index ea7118c8..7f2687d0 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -24,7 +24,8 @@ export default [ files: [ 'packages/cli/src/**/*.ts', '**/*.test.ts', - 'packages/fixtures/valid/**/*.ts' + 'packages/fixtures/valid/**/*.ts', + 'examples/**/*.ts' ], rules: { 'no-console': 'off', diff --git a/examples/search/.dev.vars.example b/examples/search/.dev.vars.example new file mode 100644 index 00000000..ccc584a3 --- /dev/null +++ b/examples/search/.dev.vars.example @@ -0,0 +1,3 @@ +SERPER_API_KEY= + +AGENTIC_PROXY_SECRET= diff --git a/examples/search/.env.example b/examples/search/.env.example new file mode 100644 index 00000000..e7f00ca9 --- /dev/null +++ b/examples/search/.env.example @@ -0,0 +1 @@ +MCP_ORIGIN_URL= diff --git a/examples/search/agentic.config.ts b/examples/search/agentic.config.ts new file mode 100644 index 00000000..52186967 --- /dev/null +++ b/examples/search/agentic.config.ts @@ -0,0 +1,17 @@ +import 'dotenv/config' + +import { defineConfig } from '@agentic/platform' + +export default defineConfig({ + name: 'search', + originUrl: process.env.MCP_ORIGIN_URL!, + originAdapter: { + type: 'mcp' + }, + toolConfigs: [ + { + name: 'search', + cacheControl: 'public, max-age=60, s-maxage=60 stale-while-revalidate=10' + } + ] +}) diff --git a/examples/search/package.json b/examples/search/package.json new file mode 100644 index 00000000..4cde3d16 --- /dev/null +++ b/examples/search/package.json @@ -0,0 +1,32 @@ +{ + "name": "@agentic/examples-search", + "private": true, + "author": "Travis Fischer ", + "license": "AGPL-3.0", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic-platform.git", + "directory": "examples/search" + }, + "type": "module", + "source": "./src/worker.ts", + "scripts": { + "dev": "wrangler dev", + "deploy": "wrangler deploy --outdir dist --upload-source-maps", + "test": "run-s test:*", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentic/platform": "workspace:*", + "@agentic/serper": "^7.6.7", + "@hono/mcp": "^0.1.0", + "@modelcontextprotocol/sdk": "catalog:", + "dotenv": "^16.5.0", + "hono": "catalog:", + "zod": "catalog:" + }, + "devDependencies": { + "@cloudflare/workers-types": "catalog:", + "wrangler": "catalog:" + } +} diff --git a/examples/search/src/env.ts b/examples/search/src/env.ts new file mode 100644 index 00000000..40455b0d --- /dev/null +++ b/examples/search/src/env.ts @@ -0,0 +1,11 @@ +import { z } from 'zod' + +export const envSchema = z.object({ + SERPER_API_KEY: z.string().nonempty() +}) + +export type Env = z.infer + +export function parseEnv(inputEnv: Record): Env { + return envSchema.parse(inputEnv) +} diff --git a/examples/search/src/worker.ts b/examples/search/src/worker.ts new file mode 100644 index 00000000..fa3e6978 --- /dev/null +++ b/examples/search/src/worker.ts @@ -0,0 +1,80 @@ +import { SerperClient } from '@agentic/serper' +import { StreamableHTTPTransport } from '@hono/mcp' +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js' +import { Hono } from 'hono' +import { z } from 'zod' + +import { type Env, parseEnv } from './env' + +const app = new Hono() + +const mcpServer = new McpServer({ + name: 'search', + version: '1.0.0' +}) + +let serper: SerperClient + +mcpServer.registerTool( + 'search', + { + description: + 'Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.', + inputSchema: z.object({ + query: z.string().describe('Search query'), + num: z + .number() + .int() + .default(5) + .optional() + .describe('Number of results to return'), + type: z + .enum(['search', 'images', 'videos', 'places', 'news', 'shopping']) + .default('search') + .optional() + .describe('Type of Google search to perform') + }).shape, + outputSchema: z.object({}).passthrough().shape + }, + async (args, { _meta }) => { + // (_meta.agentic as any).agenticProxySecret + + const result: any = await serper!.search({ + q: args.query, + num: args.num, + type: args.type + }) + + delete result.topStories + delete result.peopleAlsoAsk + delete result.searchParameters + delete result.credits + + return { + content: [], + structuredContent: result + } + } +) + +app.all('/mcp', async (c) => { + const transport = new StreamableHTTPTransport() + await mcpServer.connect(transport) + return transport.handleRequest(c) +}) + +export default { + async fetch( + request: Request, + env: Env, + ctx: ExecutionContext + ): Promise { + const parsedEnv = parseEnv(env) + + if (!serper) { + serper = new SerperClient({ apiKey: parsedEnv.SERPER_API_KEY }) + } + + return app.fetch(request, parsedEnv, ctx) + } +} satisfies ExportedHandler diff --git a/examples/search/tsconfig.json b/examples/search/tsconfig.json new file mode 100644 index 00000000..f48bb956 --- /dev/null +++ b/examples/search/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "compilerOptions": { + "types": ["@cloudflare/workers-types"] + }, + "include": ["src", "*.config.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/examples/search/wrangler.jsonc b/examples/search/wrangler.jsonc new file mode 100644 index 00000000..4c1ec944 --- /dev/null +++ b/examples/search/wrangler.jsonc @@ -0,0 +1,12 @@ +/** + * https://developers.cloudflare.com/workers/wrangler/configuration/ + */ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "agentic-mcp-search", + "main": "src/worker.ts", + "compatibility_date": "2025-05-25", + "compatibility_flags": ["nodejs_compat"], + "placement": { "mode": "smart" }, + "upload_source_maps": true +} diff --git a/package.json b/package.json index c45da8ab..c76f5889 100644 --- a/package.json +++ b/package.json @@ -7,14 +7,14 @@ "type": "git", "url": "git+https://github.com/transitive-bullshit/agentic-platform.git" }, - "packageManager": "pnpm@10.12.1", + "packageManager": "pnpm@10.12.2", "engines": { "node": ">=22" }, "type": "module", "scripts": { "build": "turbo build --filter=!web", - "dev": "turbo dev --continue", + "dev": "turbo dev --continue --filter=!./examples/*", "clean": "turbo clean", "fix": "run-s fix:*", "fix:format": "prettier --write \"**/*.{js,ts,tsx}\"", diff --git a/packages/api-client/src/agentic-api-client.ts b/packages/api-client/src/agentic-api-client.ts index 9b64e5cf..eed4a819 100644 --- a/packages/api-client/src/agentic-api-client.ts +++ b/packages/api-client/src/agentic-api-client.ts @@ -37,7 +37,7 @@ export class AgenticApiClient { apiKey?: string ky?: KyInstance onUpdateAuth?: OnUpdateAuthSessionFunction - }) { + } = {}) { assert(apiBaseUrl, 'AgenticApiClient missing required "apiBaseUrl"') this.apiBaseUrl = apiBaseUrl @@ -655,7 +655,7 @@ export class AgenticApiClient { .json() } - /** Gets a deployment by its public identifier. */ + /** Gets a deployment by its identifier. */ async getDeploymentByIdentifier< TPopulate extends NonNullable< OperationParameters<'getDeploymentByIdentifier'>['populate'] @@ -672,6 +672,23 @@ export class AgenticApiClient { .json() } + /** Gets a public deployment by its identifier. */ + async getPublicDeploymentByIdentifier< + TPopulate extends NonNullable< + OperationParameters<'getPublicDeploymentByIdentifier'>['populate'] + >[number] + >( + searchParams: OperationParameters<'getPublicDeploymentByIdentifier'> & { + populate?: TPopulate[] + } + ): Promise> { + return this.ky + .get(`v1/deployments/public/by-identifier`, { + searchParams: sanitizeSearchParams(searchParams) + }) + .json() + } + /** Updates a deployment. */ async updateDeployment( deployment: OperationBody<'updateDeployment'>, diff --git a/packages/platform/package.json b/packages/platform/package.json index f063e9f4..1203070f 100644 --- a/packages/platform/package.json +++ b/packages/platform/package.json @@ -22,20 +22,17 @@ "test:unit": "vitest run" }, "dependencies": { + "@agentic/core": "^7.6.7", "@agentic/platform-core": "workspace:*", "@agentic/platform-openapi-utils": "workspace:*", "@agentic/platform-types": "workspace:*", "@agentic/platform-validators": "workspace:*", - "@hono/zod-openapi": "catalog:", "@modelcontextprotocol/sdk": "catalog:", "semver": "catalog:", - "unconfig": "catalog:", - "zod": "catalog:" + "unconfig": "catalog:" }, "devDependencies": { - "@types/semver": "catalog:", - "restore-cursor": "catalog:", - "zod-to-json-schema": "catalog:" + "@types/semver": "catalog:" }, "publishConfig": { "access": "public" diff --git a/packages/tool-client/package.json b/packages/tool-client/package.json new file mode 100644 index 00000000..17a96d40 --- /dev/null +++ b/packages/tool-client/package.json @@ -0,0 +1,32 @@ +{ + "name": "@agentic/platform-tool-client", + "version": "0.1.0", + "description": "Tool client for the Agentic platform.", + "author": "Travis Fischer ", + "license": "AGPL-3.0", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic-platform.git", + "directory": "packages/tool-client" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./src/index.ts", + "sideEffects": false, + "exports": { + ".": "./src/index.ts" + }, + "scripts": { + "test": "run-s test:*", + "test:typecheck": "tsc --noEmit", + "test:unit": "vitest run" + }, + "dependencies": { + "@agentic/core": "^7.6.7", + "@agentic/platform-api-client": "workspace:*", + "@agentic/platform-core": "workspace:*", + "@agentic/platform-types": "workspace:*", + "@agentic/platform-validators": "workspace:*", + "ky": "catalog:" + } +} diff --git a/packages/tool-client/readme.md b/packages/tool-client/readme.md new file mode 100644 index 00000000..a4ae6d76 --- /dev/null +++ b/packages/tool-client/readme.md @@ -0,0 +1,23 @@ +## Project Identifier + +`@namespace/project-name` + +## Deployment Identifier + +`${projectIdentifier}` => `${projectIdentifier}@latest` +`${projectIdentifier}@latest` +`${projectIdentifier}@dev` +`${projectIdentifier}@deploymentHash` +`${projectIdentifier}@version` + +## Tool Identifier + +`${deploymentIdentifier}/tool_name` + +## Tool Names + +- Must start with a letter or underscore +- Can include only letters, numbers, and underscores +- Use either camelCase or snake_case consistently across all tools + +[OpenAI vs Anthropic vs Google vs MCP tool name restrictions](https://chatgpt.com/share/68419382-73a0-8007-afce-0ded7d9f05e7) diff --git a/packages/tool-client/src/agentic-tool-client.ts b/packages/tool-client/src/agentic-tool-client.ts new file mode 100644 index 00000000..d9c20513 --- /dev/null +++ b/packages/tool-client/src/agentic-tool-client.ts @@ -0,0 +1,139 @@ +import type { Deployment, Project } from '@agentic/platform-types' +import { + AIFunctionSet, + AIFunctionsProvider, + createAIFunction, + createJsonSchema +} from '@agentic/core' +import { AgenticApiClient } from '@agentic/platform-api-client' +import { assert } from '@agentic/platform-core' +import { parseDeploymentIdentifier } from '@agentic/platform-validators' +import defaultKy, { type KyInstance } from 'ky' + +/** + * Agentic tool client which makes it easy to use an Agentic tools product with + * all of the major TypeScript LLM SDKs. + * + * @example + * ```ts + * const client = await AgenticToolClient.fromIdentifier('@agentic/search') + * const result = await client.functions.get('search').execute('search query') + * ``` + */ +export class AgenticToolClient extends AIFunctionsProvider { + readonly project: Project + readonly deployment: Deployment + readonly agenticGatewayBaseUrl: string + readonly ky: KyInstance + + protected constructor({ + project, + deployment, + deploymentIdentifier, + agenticGatewayBaseUrl, + ky + }: { + project: Project + deployment: Deployment + deploymentIdentifier: string + agenticGatewayBaseUrl: string + ky: KyInstance + }) { + super() + + this.project = project + this.deployment = deployment + this.agenticGatewayBaseUrl = agenticGatewayBaseUrl + this.ky = ky + + this._functions = new AIFunctionSet( + deployment.tools.map((tool) => { + return createAIFunction({ + name: tool.name, + description: tool.description ?? '', + inputSchema: createJsonSchema(tool.inputSchema), + execute: async (json) => { + return ky + .post( + `${agenticGatewayBaseUrl}/${deploymentIdentifier}/${tool.name}`, + { + json + } + ) + .json() + } + }) + }) + ) + } + + override get functions(): AIFunctionSet { + assert(this._functions) + return this._functions + } + + /** + * Creates an Agentic tool client from a project or deployment identifier. + * + * You'll generally use a project identifier, which will automatically use + * that project's `latest` deployment, but if you want to target a specific + * version or preview deployment, you can use a fully-qualified deployment + * identifier. + * + * @example + * ```ts + * const client1 = await AgenticToolClient.fromIdentifier('@agentic/search') + * const client2 = await AgenticToolClient.fromIdentifier('@agentic/search@v1.0.0') + * const client3 = await AgenticToolClient.fromIdentifier('@agentic/search@latest') + * ``` + */ + static async fromIdentifier( + projectOrDeploymentIdentifier: string, + { + agenticApiClient = new AgenticApiClient(), + agenticGatewayBaseUrl = 'https://gateway.agentic.so', + ky = defaultKy + }: { + agenticApiClient?: AgenticApiClient + agenticGatewayBaseUrl?: string + ky?: KyInstance + } = {} + ): Promise { + const { projectIdentifier, deploymentIdentifier, deploymentVersion } = + parseDeploymentIdentifier(projectOrDeploymentIdentifier, { + strict: false + }) + + const [project, rawDeployment] = await Promise.all([ + agenticApiClient.getPublicProjectByIdentifier({ + projectIdentifier, + populate: + deploymentVersion === 'latest' ? ['lastPublishedDeployment'] : [] + }), + + // Only make 1 API call in the 95% case where the deployment version is + // set to the default value of `latest`. + deploymentVersion === 'latest' + ? Promise.resolve(undefined) + : agenticApiClient.getPublicDeploymentByIdentifier({ + deploymentIdentifier + }) + ]) + + const deployment = + deploymentVersion === 'latest' + ? project?.lastPublishedDeployment + : rawDeployment + + assert(project, `Project "${projectIdentifier}" not found`) + assert(deployment, `Deployment "${deploymentIdentifier}" not found`) + + return new AgenticToolClient({ + project, + deployment, + deploymentIdentifier, + agenticGatewayBaseUrl, + ky + }) + } +} diff --git a/packages/tool-client/src/index.ts b/packages/tool-client/src/index.ts new file mode 100644 index 00000000..c362c852 --- /dev/null +++ b/packages/tool-client/src/index.ts @@ -0,0 +1 @@ +export * from './agentic-tool-client' diff --git a/packages/tool-client/tsconfig.json b/packages/tool-client/tsconfig.json new file mode 100644 index 00000000..ce6d4e23 --- /dev/null +++ b/packages/tool-client/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src", "*.config.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/types/src/openapi.d.ts b/packages/types/src/openapi.d.ts index ae3c0d66..6caf1aed 100644 --- a/packages/types/src/openapi.d.ts +++ b/packages/types/src/openapi.d.ts @@ -140,6 +140,23 @@ export interface paths { patch?: never; trace?: never; }; + "/v1/deployments/public/by-identifier": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Gets a public deployment by its identifier (eg, "@username/project-name@latest"). */ + get: operations["getPublicDeploymentByIdentifier"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/v1/users/{userId}": { parameters: { query?: never; @@ -428,7 +445,7 @@ export interface paths { path?: never; cookie?: never; }; - /** @description Gets a deployment by its public identifier */ + /** @description Gets a deployment by its identifier (eg, "@username/project-name@latest"). */ get: operations["getDeploymentByIdentifier"]; put?: never; post?: never; @@ -600,46 +617,6 @@ export interface components { team?: components["schemas"]["Team"]; lastPublishedDeployment?: unknown; lastDeployment?: unknown; - }; - TeamMember: { - createdAt: string; - updatedAt: string; - deletedAt?: string; - userId: string; - teamSlug: string; - teamId: string; - /** @enum {string} */ - role: "user" | "admin"; - confirmed: boolean; - confirmedAt?: string; - }; - /** @description A Consumer represents a user who has subscribed to a Project and is used - * to track usage and billing. - * - * Consumers are linked to a corresponding Stripe Customer and Subscription. - * The Stripe customer will either be the user's default Stripe Customer if the - * project uses the default Agentic platform account, or a customer on the project - * owner's connected Stripe account if the project has Stripe Connect enabled. */ - Consumer: { - /** @description Consumer id (e.g. "csmr_tz4a98xxat96iws9zmbrgj3a") */ - id: string; - createdAt: string; - updatedAt: string; - deletedAt?: string; - token: string; - plan?: string; - activated: boolean; - source?: string; - /** @description User id (e.g. "user_tz4a98xxat96iws9zmbrgj3a") */ - userId: string; - /** @description Project id (e.g. "proj_tz4a98xxat96iws9zmbrgj3a") */ - projectId: string; - /** @description Deployment id (e.g. "depl_tz4a98xxat96iws9zmbrgj3a") */ - deploymentId: string; - stripeStatus: string; - isStripeSubscriptionActive: boolean; - user?: components["schemas"]["User"]; - project?: components["schemas"]["Project"]; deployment?: unknown; }; /** @description Public deployment identifier (e.g. "@namespace/project-name@{hash|version|latest}") */ @@ -899,6 +876,47 @@ export interface components { defaultRateLimit?: components["schemas"]["RateLimit"] & unknown; project?: unknown; }; + TeamMember: { + createdAt: string; + updatedAt: string; + deletedAt?: string; + userId: string; + teamSlug: string; + teamId: string; + /** @enum {string} */ + role: "user" | "admin"; + confirmed: boolean; + confirmedAt?: string; + }; + /** @description A Consumer represents a user who has subscribed to a Project and is used + * to track usage and billing. + * + * Consumers are linked to a corresponding Stripe Customer and Subscription. + * The Stripe customer will either be the user's default Stripe Customer if the + * project uses the default Agentic platform account, or a customer on the project + * owner's connected Stripe account if the project has Stripe Connect enabled. */ + Consumer: { + /** @description Consumer id (e.g. "csmr_tz4a98xxat96iws9zmbrgj3a") */ + id: string; + createdAt: string; + updatedAt: string; + deletedAt?: string; + token: string; + plan?: string; + activated: boolean; + source?: string; + /** @description User id (e.g. "user_tz4a98xxat96iws9zmbrgj3a") */ + userId: string; + /** @description Project id (e.g. "proj_tz4a98xxat96iws9zmbrgj3a") */ + projectId: string; + /** @description Deployment id (e.g. "depl_tz4a98xxat96iws9zmbrgj3a") */ + deploymentId: string; + stripeStatus: string; + isStripeSubscriptionActive: boolean; + user?: components["schemas"]["User"]; + project?: components["schemas"]["Project"]; + deployment?: unknown; + }; /** * @description 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. * @@ -1269,6 +1287,34 @@ export interface operations { 404: components["responses"]["404"]; }; }; + getPublicDeploymentByIdentifier: { + parameters: { + query: { + populate?: ("user" | "team" | "project") | ("user" | "team" | "project")[]; + /** @description Public deployment identifier (e.g. "@namespace/project-name@{hash|version|latest}") */ + deploymentIdentifier: components["schemas"]["DeploymentIdentifier"]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description A deployment object */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Deployment"]; + }; + }; + 400: components["responses"]["400"]; + 401: components["responses"]["401"]; + 403: components["responses"]["403"]; + 404: components["responses"]["404"]; + }; + }; getUser: { parameters: { query?: never; diff --git a/packages/types/src/types.ts b/packages/types/src/types.ts index cf114bdb..81db5b2c 100644 --- a/packages/types/src/types.ts +++ b/packages/types/src/types.ts @@ -67,3 +67,47 @@ export type AdminConsumer = Simplify< deployment?: Deployment } > + +export type AgenticMcpRequestMetadata = { + agenticProxySecret: string + sessionId: string + isCustomerSubscriptionActive: boolean + + customerId?: string + customerSubscriptionStatus?: string + customerSubscriptionPlan?: string + + userId?: string + userEmail?: string + userUsername?: string + userName?: string + userCreatedAt?: string + userUpdatedAt?: string + + deploymentId: string + deploymentIdentifier: string + projectId: string + projectIdentifier: string + + ip?: string +} & ( + | { + // If the customer has an active subscription, these fields are guaranteed + // to be present in the metadata. + isCustomerSubscriptionActive: true + + customerId: string + customerSubscriptionStatus: string + + userId: string + userEmail: string + userUsername: string + userCreatedAt: string + userUpdatedAt: string + } + | { + // If the customer does not have an active subscription, then the customer + // fields may or may not be present. + isCustomerSubscriptionActive: false + } +) diff --git a/packages/validators/src/namespace-blacklist.ts b/packages/validators/src/namespace-blacklist.ts index cbb4d91d..49aa97b7 100644 --- a/packages/validators/src/namespace-blacklist.ts +++ b/packages/validators/src/namespace-blacklist.ts @@ -1,6 +1,5 @@ export const namespaceBlacklist = new Set([ // restricted because they would be confusing - 'agentic', 'admin', 'root', 'sudo', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cf6885c..ee39e83f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ catalogs: specifier: ^0.7.9 version: 0.7.9 '@hono/node-server': - specifier: ^1.14.4 + specifier: 1.14.4 version: 1.14.4 '@hono/sentry': specifier: ^1.2.2 @@ -139,7 +139,7 @@ catalogs: specifier: ^7.1.0 version: 7.1.0 hono: - specifier: ^4.8.1 + specifier: 4.8.1 version: 4.8.1 knip: specifier: ^5.61.2 @@ -241,7 +241,7 @@ catalogs: specifier: ^3.2.4 version: 3.2.4 wrangler: - specifier: ^4.20.3 + specifier: ^4.21.0 version: 4.20.3 zod: specifier: ^3.25.67 @@ -262,7 +262,7 @@ importers: version: 1.44.2 '@fisch0920/config': specifier: 'catalog:' - version: 1.1.2(@typescript-eslint/parser@8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 1.1.2(@typescript-eslint/parser@8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0)) '@types/node': specifier: 'catalog:' version: 24.0.3 @@ -310,7 +310,7 @@ importers: version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0)) vitest: specifier: 'catalog:' - version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0) zod: specifier: 'catalog:' version: 3.25.67 @@ -463,9 +463,6 @@ importers: '@agentic/platform-validators': specifier: workspace:* version: link:../../packages/validators - '@cloudflare/workers-oauth-provider': - specifier: ^0.0.5 - version: 0.0.5 '@hono/zod-validator': specifier: 'catalog:' version: 0.7.0(hono@4.8.1)(zod@3.25.67) @@ -545,6 +542,9 @@ importers: '@radix-ui/react-slot': specifier: ^1.2.3 version: 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-tabs': + specifier: ^1.1.12 + version: 1.1.12(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-tooltip': specifier: ^1.2.7 version: 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -584,6 +584,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + hast-util-to-jsx-runtime: + specifier: ^2.3.6 + version: 2.3.6 ky: specifier: 'catalog:' version: 1.8.1 @@ -617,6 +620,9 @@ importers: react-use: specifier: ^17.6.0 version: 17.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + shiki: + specifier: ^3.7.0 + version: 3.7.0 sonner: specifier: ^2.0.5 version: 2.0.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -664,6 +670,37 @@ importers: specifier: ^1.3.4 version: 1.3.4 + examples/search: + dependencies: + '@agentic/platform': + specifier: workspace:* + version: link:../../packages/platform + '@agentic/serper': + specifier: ^7.6.7 + version: 7.6.7(zod@3.25.67) + '@hono/mcp': + specifier: ^0.1.0 + version: 0.1.0(@modelcontextprotocol/sdk@1.13.0)(hono@4.8.1) + '@modelcontextprotocol/sdk': + specifier: 'catalog:' + version: 1.13.0 + dotenv: + specifier: ^16.5.0 + version: 16.5.0 + hono: + specifier: 'catalog:' + version: 4.8.1 + zod: + specifier: 'catalog:' + version: 3.25.67 + devDependencies: + '@cloudflare/workers-types': + specifier: 'catalog:' + version: 4.20250620.0 + wrangler: + specifier: 'catalog:' + version: 4.21.0(@cloudflare/workers-types@4.20250620.0) + packages/api-client: dependencies: '@agentic/platform-core': @@ -917,6 +954,9 @@ importers: packages/platform: dependencies: + '@agentic/core': + specifier: ^7.6.7 + version: 7.6.7(zod@3.25.67) '@agentic/platform-core': specifier: workspace:* version: link:../core @@ -929,9 +969,6 @@ importers: '@agentic/platform-validators': specifier: workspace:* version: link:../validators - '@hono/zod-openapi': - specifier: 'catalog:' - version: 0.19.8(hono@4.8.1)(zod@3.25.67) '@modelcontextprotocol/sdk': specifier: 'catalog:' version: 1.13.0 @@ -941,19 +978,31 @@ importers: unconfig: specifier: 'catalog:' version: 7.3.2 - zod: - specifier: 'catalog:' - version: 3.25.67 devDependencies: '@types/semver': specifier: 'catalog:' version: 7.7.0 - restore-cursor: + + packages/tool-client: + dependencies: + '@agentic/core': + specifier: ^7.6.7 + version: 7.6.7(zod@3.25.67) + '@agentic/platform-api-client': + specifier: workspace:* + version: link:../api-client + '@agentic/platform-core': + specifier: workspace:* + version: link:../core + '@agentic/platform-types': + specifier: workspace:* + version: link:../types + '@agentic/platform-validators': + specifier: workspace:* + version: link:../validators + ky: specifier: 'catalog:' - version: 5.1.0 - zod-to-json-schema: - specifier: 'catalog:' - version: 3.24.5(zod@3.25.67) + version: 1.8.1 packages/types: dependencies: @@ -1003,6 +1052,16 @@ importers: packages: + '@agentic/core@7.6.7': + resolution: {integrity: sha512-xFJnTAgI+F+uikoFkXnYH4eFso4VhXR2l/d+SQJ0wRRIGgJKAHju0yJUHAwL2qPRvuAMY56IUkWKN8eMC1AxKQ==} + peerDependencies: + zod: ^3.25.55 + + '@agentic/serper@7.6.7': + resolution: {integrity: sha512-U8LtLH5k5Uy8vfXF6X2IVXuxSjRUeAQqPyWe0qee/v6tTa95NwDUKSivg5naNTdwrOdCCRd1GUZ4krdgaF4RgQ==} + peerDependencies: + zod: ^3.25.55 + '@ai-sdk/provider-utils@2.2.8': resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} engines: {node: '>=18'} @@ -1134,9 +1193,6 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workers-oauth-provider@0.0.5': - resolution: {integrity: sha512-t1x5KAzsubCvb4APnJ93z407X1x7SGj/ga5ziRnwIb/iLy4PMkT/hgd1y5z7Bbsdy5Fy6mywhCP4lym24bX66w==} - '@cloudflare/workers-types@4.20250620.0': resolution: {integrity: sha512-EVvRB/DJEm6jhdKg+A4Qm4y/ry1cIvylSgSO3/f/Bv161vldDRxaXM2YoQQWFhLOJOw0qtrHsKOD51KYxV1XCw==} @@ -1797,6 +1853,12 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@hono/mcp@0.1.0': + resolution: {integrity: sha512-IELNnKF5tjbUm+wthfToZrNxZIjs1RWLiwCx8N+m8xfJcL6hfcpj/21Gsw8HL88lbnCh191mbFwYvXnx856QZg==} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.12.0 + hono: '*' + '@hono/node-server@1.14.4': resolution: {integrity: sha512-DnxpshhYewr2q9ZN8ez/M5mmc3sucr8CT1sIgIy1bkeUXut9XWDkqHoFHRhWIQgkYnKpVRxunyhK7WzpJeJ6qQ==} engines: {node: '>=18.14.1'} @@ -2799,6 +2861,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-tabs@1.1.12': + resolution: {integrity: sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-tooltip@1.2.7': resolution: {integrity: sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==} peerDependencies: @@ -3284,6 +3359,27 @@ packages: resolution: {integrity: sha512-A4srR9mEBFdVXwSEKjQ94msUbVkMr8JeFiEj9ouOFORw/Y/ux/WV2bWVD/ZI9wq0TcTNK8L1wBgU8UMS5lIq3A==} engines: {node: '>=14.18'} + '@shikijs/core@3.7.0': + resolution: {integrity: sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==} + + '@shikijs/engine-javascript@3.7.0': + resolution: {integrity: sha512-0t17s03Cbv+ZcUvv+y33GtX75WBLQELgNdVghnsdhTgU3hVcWcMsoP6Lb0nDTl95ZJfbP1mVMO0p3byVh3uuzA==} + + '@shikijs/engine-oniguruma@3.7.0': + resolution: {integrity: sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==} + + '@shikijs/langs@3.7.0': + resolution: {integrity: sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==} + + '@shikijs/themes@3.7.0': + resolution: {integrity: sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==} + + '@shikijs/types@3.7.0': + resolution: {integrity: sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} @@ -3469,6 +3565,9 @@ packages: '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -3478,9 +3577,15 @@ packages: '@types/draco3d@1.4.10': resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/js-cookie@2.2.7': resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} @@ -3490,6 +3595,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -3542,6 +3650,12 @@ packages: '@types/three@0.177.0': resolution: {integrity: sha512-/ZAkn4OLUijKQySNci47lFO+4JLE1TihEjsGWPUT+4jWqxtwOPPEwJV1C3k5MEx0mcBPCdkFjzRzDOnHEI1R+A==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/webxr@0.5.22': resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} @@ -3604,6 +3718,9 @@ packages: resolution: {integrity: sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@use-gesture/core@10.3.1': resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} @@ -3959,6 +4076,9 @@ packages: canvas-confetti@1.9.3: resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} @@ -3974,6 +4094,18 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -4047,6 +4179,9 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -4200,6 +4335,17 @@ packages: decode-formdata@0.9.0: resolution: {integrity: sha512-q5uwOjR3Um5YD+ZWPOF/1sGHVW9A5rCrRwITQChRXlmPkxDFBqCm4jNTIVdGHNH9OnR+V9MoZVgRhsFb+ARbUw==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -4243,6 +4389,10 @@ packages: resolution: {integrity: sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==} engines: {node: '>=18'} + delay@6.0.0: + resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} + engines: {node: '>=16'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -4264,6 +4414,9 @@ packages: devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} @@ -4661,6 +4814,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -4724,8 +4880,8 @@ packages: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} - exsolve@1.0.6: - resolution: {integrity: sha512-Q05uIdxhPBVBwK29gcPsl2K220xSBy52TZQPdeYWE0zOs8jM+yJ6y5h7jm6cpAo1p+OOMZRIj/Ftku4EQQBLnQ==} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -5005,6 +5161,15 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hls.js@1.6.5: resolution: {integrity: sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ==} @@ -5016,6 +5181,9 @@ packages: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} @@ -5082,6 +5250,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-prefixer@7.0.1: resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} @@ -5097,6 +5268,12 @@ packages: resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} engines: {node: '>=8'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -5136,6 +5313,9 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5169,6 +5349,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -5375,6 +5558,10 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + jsonrepair@3.12.0: + resolution: {integrity: sha512-SWfjz8SuQ0wZjwsxtSJ3Zy8vvLg6aO/kxcp9TWNPGwJKgTZVfhNEQBMk/vPOpYCDFWRxD6QWuI6IHR1t615f0w==} + hasBin: true + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -5531,6 +5718,9 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -5586,6 +5776,30 @@ packages: peerDependencies: react: ^18.0 || ^19.0 + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -5620,6 +5834,69 @@ packages: meshoptimizer@0.18.1: resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -5662,6 +5939,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + miniflare@4.20250617.3: + resolution: {integrity: sha512-j+LZycT11UdlVeNdaqD0XdNnYnqAL+wXmboz+tNPFgTq6zhD489Ujj3BfSDyEHDCA9UFBLbkc5ByGWBh+pYZ5Q==} + engines: {node: '>=18.0.0'} + hasBin: true + minimatch@10.0.3: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} @@ -5891,6 +6173,12 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + only-allow@1.2.1: resolution: {integrity: sha512-M7CJbmv7UCopc0neRKdzfoGWaVZC+xC1925GitKH9EAqYFzX9//25Q7oX4+jw0tiCCj+t5l6VZh8UPH23NZkMA==} hasBin: true @@ -5899,6 +6187,12 @@ packages: resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} engines: {node: '>=18'} + openai-zod-to-json-schema@1.0.3: + resolution: {integrity: sha512-CFU+KtOmX1dk2nPCZcGYgbrI3YLJJgMSehx1mLbH1A2fsRmZevHzMau6vFIhtkCpHWkGQ3ossA4a0OzVHlGrkw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + openapi-typescript@7.8.0: resolution: {integrity: sha512-1EeVWmDzi16A+siQlo/SwSGIT7HwaFAVjvMA7/jG5HMLSnrUOzPL7uSTRZZa4v/LCRxHTApHKtNY6glApEoiUQ==} hasBin: true @@ -5947,6 +6241,10 @@ packages: resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} + p-throttle@6.2.0: + resolution: {integrity: sha512-NCKkOVj6PZa6NiTmfvGilDdf6vO1rFCD3KDnkHko8dTOtkpk4cSR/VTAhhLMG9aiQ7/A9HYgEDNmxzf6hxzR3g==} + engines: {node: '>=18'} + p-times@4.0.0: resolution: {integrity: sha512-KqBkcxIZ2EZHHkt8lbNORmRofFLrLlHQh0ObFO3moOlrdN/v+sbJ2ssZspP5GN7E7zwvcqiqV0xnJydkQuoNyw==} engines: {node: '>=12.20'} @@ -5958,6 +6256,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@8.3.0: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} @@ -6180,6 +6481,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -6316,6 +6620,15 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -6490,6 +6803,9 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} + shiki@3.7.0: + resolution: {integrity: sha512-ZcI4UT9n6N2pDuM2n3Jbk0sR4Swzq43nLPgS/4h0E3B/NrFn2HKElrDtceSf8Zx/OWYOo7G1SAtBLypCp+YXqg==} + shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -6585,6 +6901,9 @@ packages: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -6681,6 +7000,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -6732,6 +7054,12 @@ packages: stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -6876,6 +7204,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + troika-three-text@0.52.4: resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} peerDependencies: @@ -7056,6 +7387,21 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universal-github-app-jwt@2.2.2: resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==} @@ -7121,6 +7467,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -7289,6 +7641,16 @@ packages: '@cloudflare/workers-types': optional: true + wrangler@4.21.0: + resolution: {integrity: sha512-37xm0CG2qMvsJUNZYQKje6HbCsJFYuE8dQSnu7981iDRT4DLrEIL1DAUnZJG9HiXteKPvrSj96AkZyomi5sYHw==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20250617.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -7444,8 +7806,33 @@ packages: use-sync-external-store: optional: true + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: + '@agentic/core@7.6.7(zod@3.25.67)': + dependencies: + dedent: 1.6.0 + delay: 6.0.0 + jsonrepair: 3.12.0 + ky: 1.8.1 + openai-zod-to-json-schema: 1.0.3(zod@3.25.67) + p-throttle: 6.2.0 + type-fest: 4.41.0 + zod: 3.25.67 + zod-validation-error: 3.5.2(zod@3.25.67) + transitivePeerDependencies: + - babel-plugin-macros + + '@agentic/serper@7.6.7(zod@3.25.67)': + dependencies: + '@agentic/core': 7.6.7(zod@3.25.67) + ky: 1.8.1 + zod: 3.25.67 + transitivePeerDependencies: + - babel-plugin-macros + '@ai-sdk/provider-utils@2.2.8(zod@3.25.67)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -7576,10 +7963,6 @@ snapshots: '@cloudflare/workerd-windows-64@1.20250617.0': optional: true - '@cloudflare/workers-oauth-provider@0.0.5': - dependencies: - '@cloudflare/workers-types': 4.20250620.0 - '@cloudflare/workers-types@4.20250620.0': {} '@commander-js/extra-typings@14.0.0(commander@14.0.0)': @@ -7919,11 +8302,11 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@fisch0920/config@1.1.2(@typescript-eslint/parser@8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0))': + '@fisch0920/config@1.1.2(@typescript-eslint/parser@8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(prettier@3.5.3)(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@eslint/js': 9.29.0 '@total-typescript/ts-reset': 0.6.1 - '@vitest/eslint-plugin': 1.2.5(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/eslint-plugin': 1.2.5(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0)) eslint: 9.29.0(jiti@2.4.2) eslint-config-prettier: 10.1.5(eslint@9.29.0(jiti@2.4.2)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2)) @@ -7978,6 +8361,11 @@ snapshots: '@floating-ui/utils@0.2.9': {} + '@hono/mcp@0.1.0(@modelcontextprotocol/sdk@1.13.0)(hono@4.8.1)': + dependencies: + '@modelcontextprotocol/sdk': 1.13.0 + hono: 4.8.1 + '@hono/node-server@1.14.4(hono@4.8.1)': dependencies: hono: 4.8.1 @@ -8957,6 +9345,22 @@ snapshots: optionalDependencies: '@types/react': 19.1.8 + '@radix-ui/react-tabs@1.1.12(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + '@radix-ui/react-tooltip@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -9438,6 +9842,39 @@ snapshots: dependencies: '@sentry/types': 8.9.2 + '@shikijs/core@3.7.0': + dependencies: + '@shikijs/types': 3.7.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.7.0': + dependencies: + '@shikijs/types': 3.7.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.7.0': + dependencies: + '@shikijs/types': 3.7.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.7.0': + dependencies: + '@shikijs/types': 3.7.0 + + '@shikijs/themes@3.7.0': + dependencies: + '@shikijs/types': 3.7.0 + + '@shikijs/types@3.7.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + '@sindresorhus/merge-streams@2.3.0': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -9605,20 +10042,36 @@ snapshots: dependencies: '@types/node': 24.0.3 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} '@types/diff-match-patch@1.0.36': {} '@types/draco3d@1.4.10': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/js-cookie@2.2.7': {} '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/ms@2.1.0': {} '@types/mysql@2.15.26': @@ -9684,6 +10137,10 @@ snapshots: fflate: 0.8.2 meshoptimizer: 0.18.1 + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/webxr@0.5.22': {} '@typescript-eslint/eslint-plugin@8.34.0(@typescript-eslint/parser@8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': @@ -9778,6 +10235,8 @@ snapshots: '@typescript-eslint/types': 8.34.0 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + '@use-gesture/core@10.3.1': {} '@use-gesture/react@10.3.1(react@19.1.0)': @@ -9785,13 +10244,13 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.1.0 - '@vitest/eslint-plugin@1.2.5(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/eslint-plugin@1.2.5(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@typescript-eslint/utils': 8.34.0(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.29.0(jiti@2.4.2) optionalDependencies: typescript: 5.8.3 - vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0) + vitest: 3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -10164,6 +10623,8 @@ snapshots: canvas-confetti@1.9.3: {} + ccount@2.0.1: {} + chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -10181,6 +10642,14 @@ snapshots: change-case@5.4.4: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + check-error@2.1.1: {} chokidar@4.0.3: @@ -10246,6 +10715,8 @@ snapshots: colorette@2.0.20: {} + comma-separated-tokens@2.0.3: {} + commander@11.1.0: {} commander@13.1.0: {} @@ -10373,6 +10844,12 @@ snapshots: decode-formdata@0.9.0: {} + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + dedent@1.6.0: {} + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -10416,6 +10893,8 @@ snapshots: p-map: 7.0.3 slash: 5.1.0 + delay@6.0.0: {} + depd@2.0.0: {} dequal@2.0.3: {} @@ -10430,6 +10909,10 @@ snapshots: devalue@5.1.1: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff-match-patch@1.0.5: {} doctrine@2.1.0: @@ -10956,6 +11439,8 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -11051,7 +11536,7 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.0.6: {} + exsolve@1.0.7: {} fast-content-type-parse@3.0.0: {} @@ -11345,6 +11830,44 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hls.js@1.6.5: {} hono@4.8.1: {} @@ -11357,6 +11880,8 @@ snapshots: htmlparser2: 8.0.2 selderee: 0.11.0 + html-void-elements@3.0.0: {} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 @@ -11424,6 +11949,8 @@ snapshots: inherits@2.0.4: {} + inline-style-parser@0.2.4: {} + inline-style-prefixer@7.0.1: dependencies: css-in-js-utils: 3.1.0 @@ -11438,6 +11965,13 @@ snapshots: irregular-plurals@3.5.0: {} + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -11484,6 +12018,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} + is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -11511,6 +12047,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -11673,6 +12211,8 @@ snapshots: jsonpointer@5.0.1: {} + jsonrepair@3.12.0: {} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -11831,6 +12371,8 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -11878,6 +12420,95 @@ snapshots: marked: 7.0.4 react: 19.1.0 + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdn-data@2.0.14: {} media-typer@1.1.0: {} @@ -11898,6 +12529,139 @@ snapshots: meshoptimizer@0.18.1: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1(supports-color@10.0.0) + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -11941,6 +12705,24 @@ snapshots: - bufferutil - utf-8-validate + miniflare@4.20250617.3: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + sharp: 0.33.5 + stoppable: 1.1.0 + undici: 5.29.0 + workerd: 1.20250617.0 + ws: 8.18.0 + youch: 3.3.4 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + minimatch@10.0.3: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -12173,6 +12955,14 @@ snapshots: dependencies: mimic-function: 5.0.1 + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + only-allow@1.2.1: dependencies: which-pm-runs: 1.1.0 @@ -12184,6 +12974,10 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 + openai-zod-to-json-schema@1.0.3(zod@3.25.67): + dependencies: + zod: 3.25.67 + openapi-typescript@7.8.0(typescript@5.8.3): dependencies: '@redocly/openapi-core': 1.34.3(supports-color@10.0.0) @@ -12261,6 +13055,8 @@ snapshots: p-map@7.0.3: {} + p-throttle@6.2.0: {} + p-times@4.0.0: dependencies: p-map: 5.5.0 @@ -12271,6 +13067,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@8.3.0: dependencies: '@babel/code-frame': 7.27.1 @@ -12443,6 +13249,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@7.1.0: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -12609,6 +13417,16 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + regexp-tree@0.1.27: {} regexp.prototype.flags@1.5.4: @@ -12875,6 +13693,17 @@ snapshots: shell-quote@1.8.3: {} + shiki@3.7.0: + dependencies: + '@shikijs/core': 3.7.0 + '@shikijs/engine-javascript': 3.7.0 + '@shikijs/engine-oniguruma': 3.7.0 + '@shikijs/langs': 3.7.0 + '@shikijs/themes': 3.7.0 + '@shikijs/types': 3.7.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + shimmer@1.2.1: {} side-channel-list@1.0.0: @@ -12987,6 +13816,8 @@ snapshots: dependencies: whatwg-url: 7.1.0 + space-separated-tokens@2.0.2: {} + stack-generator@2.0.10: dependencies: stackframe: 1.3.4 @@ -13107,6 +13938,11 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -13145,6 +13981,14 @@ snapshots: stubborn-fs@1.2.5: {} + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + styled-jsx@5.1.6(react@19.1.0): dependencies: client-only: 0.0.1 @@ -13275,6 +14119,8 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + troika-three-text@0.52.4(three@0.177.0): dependencies: bidi-js: 1.0.3 @@ -13471,13 +14317,36 @@ snapshots: unenv@2.0.0-rc.17: dependencies: defu: 6.1.4 - exsolve: 1.0.6 + exsolve: 1.0.7 ohash: 2.0.11 pathe: 2.0.3 ufo: 1.6.1 unicorn-magic@0.3.0: {} + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universal-github-app-jwt@2.2.2: {} universal-user-agent@7.0.3: {} @@ -13525,6 +14394,16 @@ snapshots: vary@1.1.2: {} + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + vite-node@3.2.4(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 @@ -13574,7 +14453,7 @@ snapshots: tsx: 4.20.3 yaml: 2.8.0 - vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0): + vitest@3.2.4(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@24.0.3)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.42.0)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -13601,6 +14480,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 5.0.0 + '@types/debug': 4.1.12 '@types/node': 24.0.3 transitivePeerDependencies: - jiti @@ -13728,6 +14608,23 @@ snapshots: - bufferutil - utf-8-validate + wrangler@4.21.0(@cloudflare/workers-types@4.20250620.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250617.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.4 + miniflare: 4.20250617.3 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.17 + workerd: 1.20250617.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20250620.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -13814,3 +14711,5 @@ snapshots: '@types/react': 19.1.8 react: 19.1.0 use-sync-external-store: 1.5.0(react@19.1.0) + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e2170110..17efb6a1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - packages/* - apps/* + - examples/* - packages/fixtures/valid/* catalog: @@ -13,7 +14,7 @@ catalog: '@fisch0920/config': ^1.1.2 '@fisch0920/drizzle-orm': ^0.43.7 '@fisch0920/drizzle-zod': ^0.7.9 - '@hono/node-server': ^1.14.4 + '@hono/node-server': 1.14.4 '@hono/sentry': ^1.2.2 '@hono/zod-openapi': ^0.19.8 '@hono/zod-validator': ^0.7.0 @@ -52,7 +53,7 @@ catalog: fastmcp: ^3.4.0 get-port: ^7.1.0 hash-object: ^5.0.1 - hono: ^4.8.1 + hono: 4.8.1 is-relative-url: ^4.0.0 knip: ^5.61.2 ky: 1.8.1 @@ -88,7 +89,7 @@ catalog: unconfig: ^7.3.2 vite-tsconfig-paths: ^5.1.4 vitest: ^3.2.4 - wrangler: ^4.20.3 + wrangler: ^4.21.0 zod: ^3.25.67 zod-to-json-schema: ^3.24.5 zod-validation-error: ^3.5.2