Co-authored-by: khimaros <231498+khimaros@users.noreply.github.com>
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import { z } from "zod"
|
|
import { Effect } from "effect"
|
|
|
|
export type ToolContext = {
|
|
sessionID: string
|
|
messageID: string
|
|
agent: string
|
|
/**
|
|
* Current project directory for this session.
|
|
* Prefer this over process.cwd() when resolving relative paths.
|
|
*/
|
|
directory: string
|
|
/**
|
|
* Project worktree root for this session.
|
|
* Useful for generating stable relative paths (e.g. path.relative(worktree, absPath)).
|
|
*/
|
|
worktree: string
|
|
abort: AbortSignal
|
|
metadata(input: { title?: string; metadata?: { [key: string]: any } }): void
|
|
ask(input: AskInput): Effect.Effect<void>
|
|
}
|
|
|
|
type AskInput = {
|
|
permission: string
|
|
patterns: string[]
|
|
always: string[]
|
|
metadata: { [key: string]: any }
|
|
}
|
|
|
|
export type ToolAttachment = {
|
|
type: "file"
|
|
mime: string
|
|
url: string
|
|
filename?: string
|
|
}
|
|
|
|
export type ToolResult =
|
|
| string
|
|
| {
|
|
title?: string
|
|
output: string
|
|
metadata?: { [key: string]: any }
|
|
attachments?: ToolAttachment[]
|
|
}
|
|
|
|
export function tool<Args extends z.ZodRawShape>(input: {
|
|
description: string
|
|
args: Args
|
|
execute(args: z.infer<z.ZodObject<Args>>, context: ToolContext): Promise<ToolResult>
|
|
}) {
|
|
return {
|
|
...input,
|
|
// Generate JSON Schema here with the same Zod instance that created
|
|
// `tool.schema` args. Zod metadata such as `.describe()` is stored in a
|
|
// module-local registry, so converting later from opencode can lose it.
|
|
jsonSchema: z.toJSONSchema(z.object(input.args), { target: "draft-7", io: "input" }),
|
|
}
|
|
}
|
|
tool.schema = z
|
|
|
|
export type ToolDefinition = ReturnType<typeof tool>
|