import { type } from "arktype"; import { log } from "../utils/cli.ts"; import { fixDoubleEscapedString } from "../utils/fixDoubleEscapedString.ts"; import type { ToolContext } from "./server.ts"; import { execute, tool } from "./shared.ts"; export const Issue = type({ title: type.string.describe("the title of the issue"), body: type.string.describe("the body content of the issue"), labels: type.string .array() .describe("optional array of label names to apply to the issue") .optional(), assignees: type.string .array() .describe("optional array of usernames to assign to the issue") .optional(), }); export function IssueTool(ctx: ToolContext) { return tool({ name: "create_issue", description: "Create a new Gitea issue", parameters: Issue, execute: execute(async (params) => { const result = await ctx.gitea.rest.issue.issueCreateIssue({ owner: ctx.repo.owner, repo: ctx.repo.name, body: { title: params.title, body: fixDoubleEscapedString(params.body), assignees: params.assignees, }, }); log.info(`ยป created issue #${result.data.number}`); return { success: true, number: result.data.number, url: result.data.html_url, title: result.data.title, state: result.data.state, labels: result.data.labels ?.map((l) => (typeof l === "string" ? l : l.name)) .filter((n): n is string => n !== undefined), assignees: result.data.assignees ?.map((a) => a.login) .filter((n): n is string => n !== undefined), }; }), }); }