Skip to content
62 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.

The Marketplace is where a workspace finds what to add, reached from Apps: the agent catalog of roles with who already does each job and Add to workspace; every integration with whether it's connected; g1t's own extensions, listed as Soon; and requests, where members ask and owners add or turn down, each told by a notification. Underneath, an extension is a manifest (publisher and tier, source and version from a tag, scopes, the domains its data goes to, its page on g1tusercontent.com, no price) and an install pins its version with an off switch, a budget and the audit log. Apps lists only what was added from the Marketplace, with pins; g1t's own pages stay in their sidebars, and AI Gateway joins Workspace's. The marketplace guide says how.1/**
2 * What a workspace has connected, by connector id (@g1t/contracts/connectors):
3 * its provider connections from the integrations service, the GitHub App's
4 * installations and its own webhooks, each with how it is doing. The
5 * Integrations directory and the Marketplace both read it.
6 */
7import type { User } from "@g1t/contracts";
8import { PROVIDERS } from "@g1t/contracts";
9import { CONNECTORS } from "@g1t/contracts/connectors";
10
11import type { ConnectedState } from "./connectors";
A GitHub App installed straight on GitHub can be added to a workspace: Import from GitHub lists the installations your GitHub account can see that this workspace hasn't added, each with Add for owners, and coming back from GitHub without g1t's own start asks which of your workspaces to add it to instead of stopping; the GitHub guide says how.12import { githubConnected } from "./github";
The Marketplace is where a workspace finds what to add, reached from Apps: the agent catalog of roles with who already does each job and Add to workspace; every integration with whether it's connected; g1t's own extensions, listed as Soon; and requests, where members ask and owners add or turn down, each told by a notification. Underneath, an extension is a manifest (publisher and tier, source and version from a tag, scopes, the domains its data goes to, its page on g1tusercontent.com, no price) and an install pins its version with an off switch, a budget and the audit log. Apps lists only what was added from the Marketplace, with pins; g1t's own pages stay in their sidebars, and AI Gateway joins Workspace's. The marketplace guide says how.13import { githubApp } from "./github.server";
14import { integrationsSection } from "./integration-sections";
15import { integrations, webhooks } from "./services.server";
16
17/** What the workspace `slug` has connected, as `viewer` may see it. Each source that does not answer counts as nothing connected. */
18export async function connectedStates(slug: string, viewer: User): Promise<Record<string, ConnectedState>> {
Every Marketplace listing says who builds it and whether you can add it: a tier (Official, Verified, Community, Internal) with what it means, and an availability (Available, Connected, Soon, or Not available here with why) that never looks like a button that doesn't work; Extensions and Integrations are grouped and filtered by both, each integration has a page with what it lets agents do today and what's Soon, and the marketplace guide says how.19 return (await workspaceConnections(slug, viewer)).connected;
20}
21
22/**
23 * What the workspace `slug` has connected, and the connectors this g1t
24 * can't connect at all, by id, each with why: GitHub when no GitHub App is
25 * set up (as on a self-hosted g1t that hasn't added one).
26 */
27export async function workspaceConnections(slug: string, viewer: User): Promise<{ connected: Record<string, ConnectedState>; unavailable: Record<string, string> }> {
The Marketplace is where a workspace finds what to add, reached from Apps: the agent catalog of roles with who already does each job and Add to workspace; every integration with whether it's connected; g1t's own extensions, listed as Soon; and requests, where members ask and owners add or turn down, each told by a notification. Underneath, an extension is a manifest (publisher and tier, source and version from a tag, scopes, the domains its data goes to, its page on g1tusercontent.com, no price) and an install pins its version with an off switch, a budget and the audit log. Apps lists only what was added from the Marketplace, with pins; g1t's own pages stay in their sidebars, and AI Gateway joins Workspace's. The marketplace guide says how.28 const [connections, github, hooks] = await Promise.all([
29 integrations.list(slug, viewer).catch(() => null),
30 githubApp.status(viewer, slug).catch(() => null),
31 webhooks.list(viewer, { workspace: slug }).catch(() => null),
32 ]);
33
34 const connected: Record<string, ConnectedState> = {};
35 if (connections?.ok) {
36 for (const connector of CONNECTORS) {
37 if (!connector.provider) continue;
38 const mine = connections.value.filter((connection) => connection.provider === connector.provider);
39 if (mine.length === 0) continue;
40 const broken = mine.find((connection) => connection.lastError);
41 connected[connector.id] = {
42 detail: mine.length === 1 ? mine[0]!.name : `${mine.length} connections: ${mine.map((c) => c.name).join(", ")}`,
43 problem: broken ? `${broken.name}: ${broken.lastError}` : null,
44 manage: `/${slug}/-/integrations/${integrationsSection(PROVIDERS[connector.provider].kind)}`,
45 };
46 }
47 }
A GitHub App installed straight on GitHub can be added to a workspace: Import from GitHub lists the installations your GitHub account can see that this workspace hasn't added, each with Add for owners, and coming back from GitHub without g1t's own start asks which of your workspaces to add it to instead of stopping; the GitHub guide says how.48 const fromGithub = github?.ok ? githubConnected(github.value.installations) : null;
49 if (fromGithub) connected.github = fromGithub;
The Marketplace is where a workspace finds what to add, reached from Apps: the agent catalog of roles with who already does each job and Add to workspace; every integration with whether it's connected; g1t's own extensions, listed as Soon; and requests, where members ask and owners add or turn down, each told by a notification. Underneath, an extension is a manifest (publisher and tier, source and version from a tag, scopes, the domains its data goes to, its page on g1tusercontent.com, no price) and an install pins its version with an off switch, a budget and the audit log. Apps lists only what was added from the Marketplace, with pins; g1t's own pages stay in their sidebars, and AI Gateway joins Workspace's. The marketplace guide says how.50 const ours = hooks?.ok ? hooks.value.filter((hook) => hook.scope === "workspace") : [];
51 if (ours.length > 0) {
52 const failing = ours.filter((hook) => hook.lastStatus === "failed");
53 connected.webhooks = {
54 detail: ours.length === 1 ? ours[0]!.url : `${ours.length} webhooks`,
55 problem: failing.length > 0 ? `The last delivery to ${failing[0]!.url} failed.` : null,
56 manage: null,
57 };
58 }
Every Marketplace listing says who builds it and whether you can add it: a tier (Official, Verified, Community, Internal) with what it means, and an availability (Available, Connected, Soon, or Not available here with why) that never looks like a button that doesn't work; Extensions and Integrations are grouped and filtered by both, each integration has a page with what it lets agents do today and what's Soon, and the marketplace guide says how.59 const unavailable: Record<string, string> = {};
60 if (github?.ok && !github.value.configured) unavailable.github = "This g1t has no GitHub App set up. Whoever runs it adds one first.";
61 return { connected, unavailable };
The Marketplace is where a workspace finds what to add, reached from Apps: the agent catalog of roles with who already does each job and Add to workspace; every integration with whether it's connected; g1t's own extensions, listed as Soon; and requests, where members ask and owners add or turn down, each told by a notification. Underneath, an extension is a manifest (publisher and tier, source and version from a tag, scopes, the domains its data goes to, its page on g1tusercontent.com, no price) and an install pins its version with an off switch, a budget and the audit log. Apps lists only what was added from the Marketplace, with pins; g1t's own pages stay in their sidebars, and AI Gateway joins Workspace's. The marketplace guide says how.62}