flagon-io/g1t

public

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

g1t/packages/contracts/src/runner.ts

113 lines4,713 bytesCodeBlame
1import type { AgentRun } from "./agents";
2import type { Trial } from "./billing";
3import type { User, Viewer } from "./identity";
4import type { Result } from "./result";
5import type { RepoPath } from "./repos";
6import type { Plan, Pull } from "./work";
7
8export type RunHostedInput = {
9 /** Extra guidance given to the agent along with the issue. */
10 instructions?: string;
11};
12
13/**
14 * Sandboxes on g1t: agents that work on an issue, and acceptance checks.
15 *
16 * Nobody who assigns a g1t agent picks a model. g1t routes each kind of
17 * work itself, and says in the session which model ran.
18 */
19/**
20 * How a workspace's agents reach a model. The workspace decides: its own
21 * provider (`own` names it), or g1t's hosted models paid from its credit.
22 */
23export type ModelAccess = {
24 /** The workspace's own model connection, by name, if it has one. */
25 own: string | null;
26 /** Whether g1t's hosted models are open to it, on its free allowance or otherwise. */
27 hosted: boolean;
28 /** Its free allowance, when that is how it reaches g1t's hosted models; null when it needs none. */
29 trial: Trial | null;
30};
31
32/**
33 * The files every g1t agent run in a repository reads as the repository's
34 * instructions, as they are on its default branch.
35 */
36export type RepoInstructions = {
37 branch: string;
38 /** Null when the repository has no commits yet. */
39 commit: string | null;
40 files: {
41 path: string;
42 /** `root` is read by every run, `directory` by runs that touch files under it, `review` by reviews. */
43 role: "root" | "directory" | "review";
44 text: string;
45 /** Longer than agents are given; they get the start of it. */
46 truncated: boolean;
47 lastChanged: { commit: string; message: string; author: string; at: string } | null;
48 }[];
49 /** How much of each file, and of all of them, an agent is given. */
50 limits: { fileChars: number; totalChars: number };
51};
52
53export interface RunnerApi {
54 /**
55 * The repository's instructions for agents (`AGENTS.md`, `CLAUDE.md`,
56 * `.g1t/review.md`), as they are on its default branch: what every g1t
57 * agent run there reads. Whoever can see the repository may ask.
58 */
59 instructions(viewer: Viewer, repo: RepoPath): Promise<Result<RepoInstructions>>;
60 /** How `workspace`'s agents would reach a model now. */
61 modelAccess(workspace: string): Promise<ModelAccess>;
62 /**
63 * Whether `viewer` may put g1t's agents to work: in `repo`'s workspace,
64 * or with none named, in any of theirs.
65 */
66 enabled(viewer: Viewer, repo?: RepoPath): Promise<boolean>;
67 /**
68 * Assigns the issue to a g1t agent: opens a draft pull request for it,
69 * made by an agent in a sandbox of its own. Returns as soon as the
70 * sandbox is starting; progress shows up in the pull request's session.
71 * Scale comes from assigning many issues, each to its own agent.
72 */
73 run(actor: User, repo: RepoPath, issue: number, input?: RunHostedInput): Promise<Result<Pull>>;
74 /**
75 * Has an agent read the repository and turn an outcome into a plan: the
76 * issues that would get there and the order they have to land in. Returns
77 * the plan's id as soon as the sandbox is starting; the plan fills in when
78 * the agent has written it. Members of the repository's workspace only.
79 */
80 plan(actor: User, repo: RepoPath, brief: string): Promise<Result<{ planId: string }>>;
81 /**
82 * Opens a plan's issues. With `assign`, a g1t agent starts on each that
83 * depends on nothing, and on the others as what they depend on merges.
84 */
85 applyPlan(
86 actor: User,
87 repo: RepoPath,
88 planId: string,
89 options?: { assign?: boolean; keep?: number[] },
90 ): Promise<Result<Plan>>;
91 /**
92 * Runs the acceptance checks of a pull request again. Whoever opened it,
93 * or a member of the repository's workspace, may ask.
94 */
95 recheck(actor: User, repo: RepoPath, number: number): Promise<Result<boolean>>;
96 /**
97 * Brings a pull request up to date with the branch it would merge into,
98 * in a sandbox. A clean merge is pushed as it is; a conflict is resolved
99 * by a g1t agent. Whoever can push to the pull request's source may ask:
100 * its author, or for one from a branch, a workspace member.
101 */
102 update(actor: User, repo: RepoPath, number: number): Promise<Result<boolean>>;
103 /**
104 * Has a g1t agent review a pull request: line comments, a summary and a
105 * verdict, posted as `g1t-agent`.
106 */
107 review(actor: User, repo: RepoPath, number: number): Promise<Result<boolean>>;
108 /**
109 * Stops an agent run: marks it stopped, destroys its sandbox, and leaves
110 * the pull request it was on for a person. Members of the workspace only.
111 */
112 stopRun(actor: User, repo: RepoPath, runId: string): Promise<Result<AgentRun>>;
113}