Publish Image / publish (push) Successful in 54s
- Tasks keyed by {taskType}-{repo}-{issue} for deduplication
- Duplicate requests (pending or running) are dropped
- Configurable concurrency via QUEUE_CONCURRENCY env (default 2)
- Workspace names now {taskType}-{repo}-{issue} for observability
- GET /queue endpoint shows pending/running tasks
- All handlers route through the queue instead of calling Coder directly
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import type { Context } from "hono";
|
|
import type { IssueCommentEvent, TaskRequest } from "../types.js";
|
|
import type { TaskQueue } from "../queue.js";
|
|
import type { Config } from "../config.js";
|
|
|
|
/**
|
|
* Issue comment created or edited → re-trigger analyst if still in analysis.
|
|
*
|
|
* Replaces: issue-comment-reply.json
|
|
*/
|
|
export function issueComment(config: Config, queue: TaskQueue) {
|
|
return async (c: Context) => {
|
|
const event = await c.req.json<IssueCommentEvent>();
|
|
|
|
if (event.action !== "created" && event.action !== "edited") {
|
|
return c.text("ignored: not a created or edited event", 200);
|
|
}
|
|
|
|
const commenter = event.comment.user.login;
|
|
const botUsernames = [config.botDevUsername, config.botReviewUsername];
|
|
|
|
if (botUsernames.includes(commenter)) {
|
|
return c.text("ignored: bot comment", 200);
|
|
}
|
|
|
|
const labels = event.issue.labels.map((l) => l.name);
|
|
const pastAnalysis =
|
|
labels.includes("ready-for-architecture") ||
|
|
labels.includes("ready-for-development");
|
|
|
|
if (pastAnalysis) {
|
|
return c.text("ignored: issue past analysis stage", 200);
|
|
}
|
|
|
|
const [org, repo] = event.repository.full_name.split("/");
|
|
|
|
const task: TaskRequest = {
|
|
taskType: "analyse",
|
|
issueNumber: event.issue.number,
|
|
giteaOrg: org,
|
|
giteaRepo: repo,
|
|
repoCloneUrl: event.repository.clone_url,
|
|
giteaToken: config.giteaDevToken,
|
|
};
|
|
|
|
const queued = queue.enqueue(task);
|
|
|
|
return c.json({ ok: true, queued });
|
|
};
|
|
}
|