158 lines
4.5 KiB
TypeScript
158 lines
4.5 KiB
TypeScript
import { Hono } from "hono"
|
|
import { describeRoute, validator, resolver } from "hono-openapi"
|
|
import z from "zod"
|
|
import { ToolRegistry } from "../../tool/registry"
|
|
import { Worktree } from "../../worktree"
|
|
import { Instance } from "../../project/instance"
|
|
import { Project } from "../../project/project"
|
|
import { MCP } from "../../mcp"
|
|
import { zodToJsonSchema } from "zod-to-json-schema"
|
|
import { errors } from "../error"
|
|
import { lazy } from "../../util/lazy"
|
|
|
|
export const ExperimentalRoutes = lazy(() =>
|
|
new Hono()
|
|
.get(
|
|
"/tool/ids",
|
|
describeRoute({
|
|
summary: "List tool IDs",
|
|
description:
|
|
"Get a list of all available tool IDs, including both built-in tools and dynamically registered tools.",
|
|
operationId: "tool.ids",
|
|
responses: {
|
|
200: {
|
|
description: "Tool IDs",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(z.array(z.string()).meta({ ref: "ToolIDs" })),
|
|
},
|
|
},
|
|
},
|
|
...errors(400),
|
|
},
|
|
}),
|
|
async (c) => {
|
|
return c.json(await ToolRegistry.ids())
|
|
},
|
|
)
|
|
.get(
|
|
"/tool",
|
|
describeRoute({
|
|
summary: "List tools",
|
|
description:
|
|
"Get a list of available tools with their JSON schema parameters for a specific provider and model combination.",
|
|
operationId: "tool.list",
|
|
responses: {
|
|
200: {
|
|
description: "Tools",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(
|
|
z
|
|
.array(
|
|
z
|
|
.object({
|
|
id: z.string(),
|
|
description: z.string(),
|
|
parameters: z.any(),
|
|
})
|
|
.meta({ ref: "ToolListItem" }),
|
|
)
|
|
.meta({ ref: "ToolList" }),
|
|
),
|
|
},
|
|
},
|
|
},
|
|
...errors(400),
|
|
},
|
|
}),
|
|
validator(
|
|
"query",
|
|
z.object({
|
|
provider: z.string(),
|
|
model: z.string(),
|
|
}),
|
|
),
|
|
async (c) => {
|
|
const { provider, model } = c.req.valid("query")
|
|
const tools = await ToolRegistry.tools({ providerID: provider, modelID: model })
|
|
return c.json(
|
|
tools.map((t) => ({
|
|
id: t.id,
|
|
description: t.description,
|
|
// Handle both Zod schemas and plain JSON schemas
|
|
parameters: (t.parameters as any)?._def ? zodToJsonSchema(t.parameters as any) : t.parameters,
|
|
})),
|
|
)
|
|
},
|
|
)
|
|
.post(
|
|
"/worktree",
|
|
describeRoute({
|
|
summary: "Create worktree",
|
|
description: "Create a new git worktree for the current project.",
|
|
operationId: "worktree.create",
|
|
responses: {
|
|
200: {
|
|
description: "Worktree created",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(Worktree.Info),
|
|
},
|
|
},
|
|
},
|
|
...errors(400),
|
|
},
|
|
}),
|
|
validator("json", Worktree.create.schema),
|
|
async (c) => {
|
|
const body = c.req.valid("json")
|
|
const worktree = await Worktree.create(body)
|
|
return c.json(worktree)
|
|
},
|
|
)
|
|
.get(
|
|
"/worktree",
|
|
describeRoute({
|
|
summary: "List worktrees",
|
|
description: "List all sandbox worktrees for the current project.",
|
|
operationId: "worktree.list",
|
|
responses: {
|
|
200: {
|
|
description: "List of worktree directories",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(z.array(z.string())),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
async (c) => {
|
|
const sandboxes = await Project.sandboxes(Instance.project.id)
|
|
return c.json(sandboxes)
|
|
},
|
|
)
|
|
.get(
|
|
"/resource",
|
|
describeRoute({
|
|
summary: "Get MCP resources",
|
|
description: "Get all available MCP resources from connected servers. Optionally filter by name.",
|
|
operationId: "experimental.resource.list",
|
|
responses: {
|
|
200: {
|
|
description: "MCP resources",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(z.record(z.string(), MCP.Resource)),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
async (c) => {
|
|
return c.json(await MCP.resources())
|
|
},
|
|
),
|
|
)
|