pr_01m47d24b0e6n91zwymwxg0vpx/packages/contracts/src/actions.ts

137 lines4,034 bytesCodeBlame
1import type { User, Viewer } from "./identity";
2import type { RepoPath } from "./repos";
3import type { Result } from "./result";
4
5/**
6 * GitHub Actions workflows, run on g1t as they are. Mirrors
7 * `crates/contracts/src/actions.rs`.
8 */
9
10export type WorkflowNote = {
11 severity: "info" | "warning" | "unsupported";
12 job: string | null;
13 message: string;
14};
15
16/** One `workflow_dispatch` input, as written in the workflow. */
17export type DispatchInput = {
18 description?: string;
19 required?: boolean;
20 default?: string | number | boolean;
21 type?: "string" | "boolean" | "number" | "choice" | "environment";
22 options?: string[];
23};
24
25export type RunStatus = "pending" | "queued" | "in_progress" | "completed";
26export type Conclusion = "success" | "failure" | "cancelled" | "skipped";
27
28export type WorkflowRun = {
29 id: string;
30 workflowId: string;
31 path: string;
32 name: string;
33 title: string;
34 number: number;
35 attempt: number;
36 event: string;
37 ref: string;
38 sha: string;
39 pull: number | null;
40 status: RunStatus;
41 conclusion: Conclusion | null;
42 error: string | null;
43 actor: string | null;
44 createdAt: string;
45 startedAt: string | null;
46 finishedAt: string | null;
47};
48
49export type Workflow = {
50 id: string;
51 path: string;
52 name: string;
53 events: string[];
54 state: "active" | "disabled";
55 error: string | null;
56 notes: WorkflowNote[];
57 dispatch: Record<string, DispatchInput> | null;
58 lastRun: WorkflowRun | null;
59};
60
61export type StepState = {
62 number: number;
63 name: string;
64 status: "queued" | "in_progress" | "completed";
65 conclusion: Conclusion | null;
66 startedAt: string | null;
67 finishedAt: string | null;
68};
69
70export type Annotation = {
71 level: "error" | "warning" | "notice";
72 message: string;
73 title: string | null;
74 file: string | null;
75 line: number | null;
76};
77
78export type Job = {
79 id: string;
80 runId: string;
81 key: string;
82 name: string;
83 needs: string[];
84 /** `calling`: running the reusable workflow it calls, whose jobs follow it. */
85 status: "waiting" | "queued" | "in_progress" | "calling" | "completed";
86 conclusion: Conclusion | null;
87 steps: StepState[];
88 annotations: Annotation[];
89 reason: string | null;
90 startedAt: string | null;
91 finishedAt: string | null;
92};
93
94export type RunDetail = { run: WorkflowRun; jobs: Job[]; notes: WorkflowNote[] };
95
96export type LogChunk = { seq: number; step: number; text: string };
97export type JobLog = { chunks: LogChunk[]; done: boolean };
98
99export type Setting = {
100 name: string;
101 /** Variables only. */
102 value: string | null;
103 scope: "repository" | "workspace";
104 updatedAt: string;
105};
106
107export type SettingsOwner = { repo: RepoPath } | { workspace: string };
108export type SettingKind = "secret" | "variable";
109
110export type RunsFilter = {
111 workflow?: string;
112 branch?: string;
113 event?: string;
114 pull?: number;
115 sha?: string;
116 limit?: number;
117};
118
119export interface ActionsApi {
120 workflows(repo: RepoPath, viewer: Viewer): Promise<Result<Workflow[]>>;
121 runs(repo: RepoPath, viewer: Viewer, filter?: RunsFilter): Promise<Result<WorkflowRun[]>>;
122 run(repo: RepoPath, viewer: Viewer, id: string): Promise<Result<RunDetail>>;
123 logs(repo: RepoPath, viewer: Viewer, job: string, after?: number): Promise<Result<JobLog>>;
124 dispatch(
125 actor: User,
126 repo: RepoPath,
127 workflow: string,
128 ref: string | undefined,
129 inputs: Record<string, unknown>,
130 ): Promise<Result<WorkflowRun>>;
131 cancel(actor: User, repo: RepoPath, id: string): Promise<Result<WorkflowRun>>;
132 rerun(actor: User, repo: RepoPath, id: string, failedOnly?: boolean): Promise<Result<WorkflowRun>>;
133 setWorkflowEnabled(actor: User, repo: RepoPath, workflow: string, enabled: boolean): Promise<Result<Workflow>>;
134 settings(actor: User, owner: SettingsOwner, kind: SettingKind): Promise<Result<Setting[]>>;
135 setSetting(actor: User, owner: SettingsOwner, kind: SettingKind, name: string, value: string): Promise<Result<Setting>>;
136 deleteSetting(actor: User, owner: SettingsOwner, kind: SettingKind, name: string): Promise<Result<boolean>>;
137}