fix: POST for file creation (Gitea 1.25+), add edit_issue tool, persist poll state

- files.ts: Use POST for new files, PUT for updates (Gitea 1.25 requires this)
- issues.ts: Add editIssue() for state/title/body changes
- write-tools.ts: Add gitea_edit_issue tool (open/close/edit issues)
- webhook/server.ts: Persist lastPollAt to disk to prevent duplicate
  events on reload; use followUp delivery to queue events during LLM turns
- index.ts: Use deliverAs:'followUp' for sendUserMessage
This commit is contained in:
2026-03-13 17:14:06 -07:00
parent 578e2f91cb
commit b868ad4df5
5 changed files with 105 additions and 9 deletions

View File

@@ -161,6 +161,32 @@ export default function (pi: ExtensionAPI) {
},
});
pi.registerTool({
name: "gitea_edit_issue",
label: "Gitea: Edit Issue",
description: "Edit an issue — change title, body, or state (open/closed). Use this to close issues when work is done.",
parameters: Type.Object({
owner: Type.Optional(Type.String({ description: `Repo owner (default: ${client.defaultOwner})` })),
repo: Type.Optional(Type.String({ description: `Repo name (default: ${client.defaultRepo})` })),
index: Type.Number({ description: "Issue number" }),
title: Type.Optional(Type.String({ description: "New title" })),
body: Type.Optional(Type.String({ description: "New body (Markdown)" })),
state: Type.Optional(Type.String({ description: "New state: 'open' or 'closed'" })),
}),
async execute(_id, params) {
const { owner, repo } = client.resolve(params.owner, params.repo);
const updated = await issues.editIssue(client, owner, repo, params.index, {
title: params.title,
body: params.body,
state: params.state as "open" | "closed" | undefined,
});
return {
content: [{ type: "text", text: `Issue #${updated.number} updated (state: ${updated.state}): ${updated.html_url}` }],
details: { issue: updated },
};
},
});
// ── Pull Requests ──
pi.registerTool({