Skip to content
165 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",
Merge Actions: cross-repo workflows and actions, release and deployment triggers, step timeouts51 "comment.edited",
52 "comment.deleted",
Webhooks: every event, to your own addresses, signed and retried53 "pull.opened",
54 "pull.ready",
55 "pull.updated",
56 "pull.merge_requested",
57 "pull.merged",
58 "pull.closed",
Merge Actions: cross-repo workflows and actions, release and deployment triggers, step timeouts59 "pull.reopened",
60 "pull.converted_to_draft",
Events: review requests, assignments, stops and deployments are published61 "pull.assigned",
62 "pull.review_requested",
63 "pull.review_request_removed",
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar64 "pull.labeled",
65 "pull.unlabeled",
66 "pull.milestoned",
67 "pull.demilestoned",
68 "pull.base_changed",
Events: review requests, assignments, stops and deployments are published69 "pull.stalled",
70 "pull.resumed",
Merge Actions: cross-repo workflows and actions, release and deployment triggers, step timeouts71 "release.created",
72 "release.published",
73 "release.released",
74 "release.prereleased",
75 "release.edited",
76 "release.unpublished",
77 "release.deleted",
Agents asked while not at work are woken to answer78 "agent.asked",
Webhooks: every event, to your own addresses, signed and retried79 "checks.completed",
Merge checks: statuses and check runs on every commit80 "status.created",
81 "check_run.created",
82 "check_run.completed",
83 "check_run.rerequested",
84 "check_run.requested_action",
85 "check_suite.completed",
86 "check_suite.rerequested",
Webhooks: every event, to your own addresses, signed and retried87 "review.completed",
Actions: workflow_run, workflow.completed, artifacts on the run page, Node 2488 "workflow.completed",
Events: review requests, assignments, stops and deployments are published89 "deployment.succeeded",
90 "deployment.failed",
Merge branch 'main' into worktree-agent-a69aeabc4b0deeb9791 "deployment.created",
92 "deployment_status.created",
Webhooks: every event, to your own addresses, signed and retried93 "queue.changed",
94 "session.appended",
Packages, with a container registry on g1t.sh; workspaces deleted whole and kept 30 days; Members for every member95 "package.published",
96 "package.version_deleted",
97 "package.deleted",
98 "package.visibility_changed",
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar99 "secret_scanning_alert.created",
100 "secret_scanning_alert.fixed",
101 "secret_scanning_alert.dismissed",
102 "secret_scanning_alert.reopened",
103 "secret_scanning.bypass_requested",
104 "secret_scanning.bypass_reviewed",
105 "code_scanning_alert.created",
106 "code_scanning_alert.fixed",
107 "code_scanning_alert.dismissed",
108 "code_scanning_alert.reopened",
109 "vulnerability_alert.created",
110 "vulnerability_alert.fixed",
111 "vulnerability_alert.dismissed",
112 "vulnerability_alert.reopened",
Webhooks: every event, to your own addresses, signed and retried113] as const;
114
115export type Hook = {
116 id: string;
117 scope: "repo" | "workspace";
118 workspace: string;
119 /** For a repository's webhook: `owner/name`. */
120 repo: string | null;
121 url: string;
122 /** Event types, or `["*"]` for all. */
123 events: string[];
124 active: boolean;
125 secretHint: string;
126 createdBy: string;
127 createdAt: string;
128 lastStatus: "delivered" | "pending" | "failed" | null;
129 lastDeliveredAt: string | null;
130};
131
132export type HookDelivery = {
133 id: string;
134 hookId: string;
135 eventId: string;
136 event: string;
137 status: "pending" | "delivered" | "failed";
138 attempts: number;
139 responseStatus: number | null;
140 responseBody: string | null;
141 error: string | null;
142 durationMs: number | null;
143 /** The JSON that was sent. */
144 payload: string;
145 createdAt: string;
146 deliveredAt: string | null;
147 nextAttemptAt: string | null;
148};
149
150/** A repository's webhooks, or with `repo` left out, the workspace's own. */
151export type HookOwner = { workspace: string; repo?: RepoPath };
152
153export interface WebhooksApi {
154 list(viewer: Viewer, owner: HookOwner): Promise<Result<Hook[]>>;
155 create(
156 actor: User,
157 owner: HookOwner,
158 input: { url: string; events?: string[]; secret?: string },
159 ): Promise<Result<{ hook: Hook; secret: string | null }>>;
160 update(actor: User, owner: HookOwner, id: string, input: { url?: string; events?: string[]; active?: boolean }): Promise<Result<Hook>>;
161 delete(actor: User, owner: HookOwner, id: string): Promise<Result<boolean>>;
162 ping(actor: User, owner: HookOwner, id: string): Promise<Result<HookDelivery>>;
163 deliveries(viewer: Viewer, owner: HookOwner, id: string): Promise<Result<HookDelivery[]>>;
164 redeliver(actor: User, owner: HookOwner, deliveryId: string): Promise<Result<HookDelivery>>;
165}

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