Skip to content
154 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Webhooks: every event, to your own addresses, signed and retried1import type { User, Viewer } from "./identity";
2import type { RepoPath } from "./repos";
3import type { Result } from "./result";
4
5/**
6 * Events, delivered to the addresses a repository or a workspace registers.
7 * Mirrors `crates/contracts/src/webhooks.rs`.
8 */
9
10/** Every event a webhook can be sent, in the order people are shown them. */
11export const EVENT_TYPES = [
12 "git.push",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look13 "branch.renamed",
Webhooks: every event, to your own addresses, signed and retried14 "repo.created",
15 "repo.forked",
Invite-only launch: sign in with GitHub, repository access and lifecycle, many emails, a new look16 "repo.updated",
17 "repo.visibility_changed",
18 "repo.renamed",
19 "repo.transferred",
20 "repo.default_branch_changed",
21 "repo.archived",
22 "repo.unarchived",
23 "repo.deleted",
24 "repo.restored",
25 "repo.purged",
26 "repo.collaborator_added",
27 "repo.collaborator_removed",
28 "repo.collaborator_role_changed",
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar29 "team.created",
30 "team.edited",
31 "team.deleted",
32 "team.member_added",
33 "team.member_role_changed",
34 "team.member_removed",
35 "team.repo_added",
36 "team.repo_role_changed",
37 "team.repo_removed",
Merge rulesets: branch and tag rules, agent-first, enforced on push and merge38 "ruleset.created",
39 "ruleset.updated",
40 "ruleset.deleted",
Webhooks: every event, to your own addresses, signed and retried41 "issue.opened",
42 "issue.updated",
43 "issue.assigned",
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar44 "issue.labeled",
45 "issue.unlabeled",
46 "issue.milestoned",
47 "issue.demilestoned",
Webhooks: every event, to your own addresses, signed and retried48 "issue.closed",
49 "issue.reopened",
50 "comment.created",
51 "pull.opened",
52 "pull.ready",
53 "pull.updated",
54 "pull.merge_requested",
55 "pull.merged",
56 "pull.closed",
Events: review requests, assignments, stops and deployments are published57 "pull.assigned",
58 "pull.review_requested",
59 "pull.review_request_removed",
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar60 "pull.labeled",
61 "pull.unlabeled",
62 "pull.milestoned",
63 "pull.demilestoned",
64 "pull.base_changed",
Events: review requests, assignments, stops and deployments are published65 "pull.stalled",
66 "pull.resumed",
Agents asked while not at work are woken to answer67 "agent.asked",
Webhooks: every event, to your own addresses, signed and retried68 "checks.completed",
Merge checks: statuses and check runs on every commit69 "status.created",
70 "check_run.created",
71 "check_run.completed",
72 "check_run.rerequested",
73 "check_run.requested_action",
74 "check_suite.completed",
75 "check_suite.rerequested",
Webhooks: every event, to your own addresses, signed and retried76 "review.completed",
Actions: workflow_run, workflow.completed, artifacts on the run page, Node 2477 "workflow.completed",
Events: review requests, assignments, stops and deployments are published78 "deployment.succeeded",
79 "deployment.failed",
Merge branch 'main' into worktree-agent-a69aeabc4b0deeb9780 "deployment.created",
81 "deployment_status.created",
Webhooks: every event, to your own addresses, signed and retried82 "queue.changed",
83 "session.appended",
Packages, with a container registry on g1t.sh; workspaces deleted whole and kept 30 days; Members for every member84 "package.published",
85 "package.version_deleted",
86 "package.deleted",
87 "package.visibility_changed",
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar88 "secret_scanning_alert.created",
89 "secret_scanning_alert.fixed",
90 "secret_scanning_alert.dismissed",
91 "secret_scanning_alert.reopened",
92 "secret_scanning.bypass_requested",
93 "secret_scanning.bypass_reviewed",
94 "code_scanning_alert.created",
95 "code_scanning_alert.fixed",
96 "code_scanning_alert.dismissed",
97 "code_scanning_alert.reopened",
98 "vulnerability_alert.created",
99 "vulnerability_alert.fixed",
100 "vulnerability_alert.dismissed",
101 "vulnerability_alert.reopened",
Webhooks: every event, to your own addresses, signed and retried102] as const;
103
104export type Hook = {
105 id: string;
106 scope: "repo" | "workspace";
107 workspace: string;
108 /** For a repository's webhook: `owner/name`. */
109 repo: string | null;
110 url: string;
111 /** Event types, or `["*"]` for all. */
112 events: string[];
113 active: boolean;
114 secretHint: string;
115 createdBy: string;
116 createdAt: string;
117 lastStatus: "delivered" | "pending" | "failed" | null;
118 lastDeliveredAt: string | null;
119};
120
121export type HookDelivery = {
122 id: string;
123 hookId: string;
124 eventId: string;
125 event: string;
126 status: "pending" | "delivered" | "failed";
127 attempts: number;
128 responseStatus: number | null;
129 responseBody: string | null;
130 error: string | null;
131 durationMs: number | null;
132 /** The JSON that was sent. */
133 payload: string;
134 createdAt: string;
135 deliveredAt: string | null;
136 nextAttemptAt: string | null;
137};
138
139/** A repository's webhooks, or with `repo` left out, the workspace's own. */
140export type HookOwner = { workspace: string; repo?: RepoPath };
141
142export interface WebhooksApi {
143 list(viewer: Viewer, owner: HookOwner): Promise<Result<Hook[]>>;
144 create(
145 actor: User,
146 owner: HookOwner,
147 input: { url: string; events?: string[]; secret?: string },
148 ): Promise<Result<{ hook: Hook; secret: string | null }>>;
149 update(actor: User, owner: HookOwner, id: string, input: { url?: string; events?: string[]; active?: boolean }): Promise<Result<Hook>>;
150 delete(actor: User, owner: HookOwner, id: string): Promise<Result<boolean>>;
151 ping(actor: User, owner: HookOwner, id: string): Promise<Result<HookDelivery>>;
152 deliveries(viewer: Viewer, owner: HookOwner, id: string): Promise<Result<HookDelivery[]>>;
153 redeliver(actor: User, owner: HookOwner, deliveryId: string): Promise<Result<HookDelivery>>;
154}

This file's history is long; its oldest lines are credited to the oldest commit read.