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.
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 1 | import { Suspense, lazy } from "react"; |
| 2 | import { type ShouldRevalidateFunctionArgs, data } from "react-router"; | |
| 3 | ||
| 4 | import type { Route } from "./+types/code-overview"; | |
| 5 | import { page } from "../../lib/meta"; | |
| 6 | import { loadMissionControl } from "../../lib/mission-control.server"; | |
| 7 | import { requireUser, roleIn } from "../../lib/session.server"; | |
| The site is built from its shared components: one Button with its variants and sizes, one Badge, Card for every panel, Alert for notices, Kbd for keys, Table for the security tables, and Avatar, Command, Progress, ScrollArea, ToggleGroup, Collapsible and Accordion in the kit; raw buttons, hand-drawn cards and pills and per-file button class lists are gone, outline buttons stand the same height as filled ones, and the phone's Ask g1t loses its tile. Every page was compared pixel by pixel before and after. | 8 | import { Card } from "../../components/ui/card"; |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 9 | import { Skeleton, SkeletonCard, SkeletonLine, SkeletonStat } from "../../components/ui/skeleton"; |
| 10 | ||
| 11 | export function meta({ params, ...args }: Route.MetaArgs) { | |
| 12 | return page(args, { title: `Overview · Code · ${params.owner} · g1t` }); | |
| 13 | } | |
| 14 | ||
| 15 | export function headers({ loaderHeaders }: Route.HeadersArgs) { | |
| 16 | const out = new Headers(); | |
| 17 | const timing = loaderHeaders.get("Server-Timing"); | |
| 18 | if (timing) out.set("Server-Timing", timing); | |
| 19 | return out; | |
| 20 | } | |
| 21 | ||
| 22 | /** | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 23 | * Code's Overview, for this workspace: what needs you and what landed, |
| 24 | * the week's numbers, activity, and a way to open an issue. | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 25 | */ |
| 26 | export async function loader({ params, context, request }: Route.LoaderArgs) { | |
| 27 | const viewer = requireUser(context, request); | |
| 28 | if (!roleIn(viewer, params.owner)) throw data(null, { status: 404 }); | |
| 29 | const { value, timing } = await loadMissionControl(viewer, request, params.owner); | |
| 30 | return data(value, { headers: { "Server-Timing": timing } }); | |
| 31 | } | |
| 32 | ||
| 33 | /** | |
| 34 | * Switching tabs, the sort or the activity list changes only the address: | |
| 35 | * everything is already loaded. Marking an inbox item read changes nothing | |
| 36 | * else here. | |
| 37 | */ | |
| 38 | export function shouldRevalidate({ currentUrl, nextUrl, formMethod, formAction, defaultShouldRevalidate }: ShouldRevalidateFunctionArgs) { | |
| 39 | if (!formMethod && currentUrl.pathname === nextUrl.pathname && currentUrl.search !== nextUrl.search) return false; | |
| g1t is described as the product it is in alpha, and its shell takes the new shape: the README, the docs home and docs/PLAN.md label every feature Live, Preview or Coming; a floating dock with the g1t mark, Today, Chat, Notifications, Agents, Code, Artifacts, your pinned apps and the Apps launcher, with People, Workspace and the account menu (now holding help) at its foot; the workspace's logo and switcher heading a flat sidebar that folds away with Ctrl B, or leading the header's breadcrumbs where there is none; the page in a rounded panel with a full-width header; Today as the front page, with first-time acceptance of agents' pull requests, what needs you and what's at stake, spend today and one item to start with, every number from a service; Notifications in place of the Inbox at /notifications; a bottom bar and More sheet on phones; and sign-in, sign-up, two-factor, reset, invites and choosing a workspace on standalone pages with no app around them. | 40 | if (formAction === "/notifications") return false; |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 41 | return defaultShouldRevalidate; |
| 42 | } | |
| 43 | ||
| 44 | /** Loaded once the browser is idle (components/shell.tsx), so the skeleton below is rarely seen. */ | |
| 45 | const MissionControl = lazy(() => import("../../components/mission-control")); | |
| 46 | ||
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 47 | export default function CodeOverview({ loaderData }: Route.ComponentProps) { |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 48 | return ( |
| 49 | <Suspense fallback={<MissionControlSkeleton />}> | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 50 | <MissionControl loaderData={loaderData} /> |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 51 | </Suspense> |
| 52 | ); | |
| 53 | } | |
| 54 | ||
| 55 | /** | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 56 | * The Overview's outline while its code arrives, piece for piece as |
| 57 | * components/mission-control.tsx lays it out: the title, the actions | |
| 58 | * under it, the stats, then the work list beside the week. Each | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 59 | * piece has the padding and line heights of the real one, so nothing moves |
| 60 | * when it arrives. | |
| 61 | */ | |
| 62 | export function MissionControlSkeleton() { | |
| 63 | return ( | |
| 64 | <main aria-busy="true" className="mx-auto max-w-7xl space-y-6 px-4 py-8 sm:px-6 sm:py-10"> | |
| 65 | <span role="status" className="sr-only"> | |
| 66 | Loading… | |
| 67 | </span> | |
| 68 | <header> | |
| 69 | <SkeletonLine className="w-72 max-w-full text-[1.75rem] leading-tight sm:text-[2rem]" barClassName="h-8" /> | |
| 70 | {/* The date and the week's summary: one line wide, three on a phone. */} | |
| 71 | <div className="mt-1.5 text-sm"> | |
| People wear their own avatars wherever g1t knows them only by name, and a workspace is never shown as a person. The activity feeds, recent changes, home's most active faces, issue and pull request authors, assignees, comments and the audit log drew a person from their username alone, so everyone got their letter avatar instead of the picture they uploaded. An avatar given no picture now draws the letter at once and lays the person's own picture over it once it loads, from /-/avatar/user/<username> (routes/avatar-user.ts): a redirect to the picture on the usercontent origin, or not found, read from identity's people only, so a workspace's icon can never stand in for someone. Kept five minutes, public like the profile. Agents, the product tour's people, "someone" and workspaces' square avatars are never looked up (image null), so an account with the same name never lends them its face. | 72 | <SkeletonLine className="w-xl max-w-full" barClassName="h-3.5" /> |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 73 | <SkeletonLine className="w-full sm:hidden" barClassName="h-3.5" /> |
| 74 | <SkeletonLine className="w-2/3 sm:hidden" barClassName="h-3.5" /> | |
| 75 | </div> | |
| 76 | </header> | |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 77 | <div className="flex flex-wrap items-center gap-2"> |
| People wear their own avatars wherever g1t knows them only by name, and a workspace is never shown as a person. The activity feeds, recent changes, home's most active faces, issue and pull request authors, assignees, comments and the audit log drew a person from their username alone, so everyone got their letter avatar instead of the picture they uploaded. An avatar given no picture now draws the letter at once and lays the person's own picture over it once it loads, from /-/avatar/user/<username> (routes/avatar-user.ts): a redirect to the picture on the usercontent origin, or not found, read from identity's people only, so a workspace's icon can never stand in for someone. Kept five minutes, public like the profile. Agents, the product tour's people, "someone" and workspaces' square avatars are never looked up (image null), so an account with the same name never lends them its face. | 78 | <Skeleton className="h-9.5 w-28 rounded-md" /> |
| 79 | <Skeleton className="h-9.5 w-44 rounded-md" /> | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 80 | </div> |
| The site no longer has g1t's own agents. g1t is where the coding agents you already use do their work, so the Agents mode is gone from the rail, with every page under /<workspace>/-/agents: personas, faces, skills, abilities, routines, computers, sessions and agent spend. Customize (skills, connectors, plugins, marketplaces), the context hub, model providers, the AI Gateway page, the Spend page and pill, Ask g1t, and the repository's Agents, Plans and agent settings pages go too, and their addresses now answer 404. | 81 | <Card tone="plain" className="grid grid-cols-2 gap-px overflow-hidden bg-line lg:grid-cols-4"> |
| 82 | {Array.from({ length: 4 }, (_, index) => ( | |
| 83 | <SkeletonStat key={index} /> | |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 84 | ))} |
| The site is built from its shared components: one Button with its variants and sizes, one Badge, Card for every panel, Alert for notices, Kbd for keys, Table for the security tables, and Avatar, Command, Progress, ScrollArea, ToggleGroup, Collapsible and Accordion in the kit; raw buttons, hand-drawn cards and pills and per-file button class lists are gone, outline buttons stand the same height as filled ones, and the phone's Ask g1t loses its tile. Every page was compared pixel by pixel before and after. | 85 | </Card> |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 86 | <div className="grid gap-6 lg:grid-cols-[minmax(0,1fr)_21rem] xl:grid-cols-[minmax(0,1fr)_23rem]"> |
| The site is built from its shared components: one Button with its variants and sizes, one Badge, Card for every panel, Alert for notices, Kbd for keys, Table for the security tables, and Avatar, Command, Progress, ScrollArea, ToggleGroup, Collapsible and Accordion in the kit; raw buttons, hand-drawn cards and pills and per-file button class lists are gone, outline buttons stand the same height as filled ones, and the phone's Ask g1t loses its tile. Every page was compared pixel by pixel before and after. | 87 | <Card className="self-start overflow-hidden"> |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 88 | <div className="flex items-center gap-4 border-b border-line px-4 py-3 text-sm sm:px-5"> |
| 89 | <SkeletonLine className="w-24" /> | |
| 90 | <SkeletonLine className="w-32" /> | |
| 91 | <SkeletonLine className="hidden w-28 sm:flex" /> | |
| 92 | </div> | |
| 93 | <div className="divide-y divide-line"> | |
| 94 | {Array.from({ length: 5 }, (_, index) => ( | |
| 95 | <div key={index}> | |
| 96 | <div className="flex items-center gap-3 px-4 py-3 sm:px-5"> | |
| 97 | <Skeleton className="size-8 shrink-0 rounded-md" /> | |
| 98 | <span className="min-w-0 grow"> | |
| 99 | <SkeletonLine className="text-sm" width={`${70 - ((index * 17) % 30)}%`} /> | |
| 100 | <SkeletonLine className="mt-0.5 text-xs" width={`${50 - ((index * 11) % 20)}%`} /> | |
| 101 | </span> | |
| 102 | <Skeleton className="hidden h-4 w-24 shrink-0 sm:block" /> | |
| 103 | </div> | |
| 104 | {/* The first row stands open, as the real list's does. */} | |
| 105 | {index === 0 && ( | |
| 106 | <div className="px-4 pb-4 sm:px-5 sm:pb-5"> | |
| People wear their own avatars wherever g1t knows them only by name, and a workspace is never shown as a person. The activity feeds, recent changes, home's most active faces, issue and pull request authors, assignees, comments and the audit log drew a person from their username alone, so everyone got their letter avatar instead of the picture they uploaded. An avatar given no picture now draws the letter at once and lays the person's own picture over it once it loads, from /-/avatar/user/<username> (routes/avatar-user.ts): a redirect to the picture on the usercontent origin, or not found, read from identity's people only, so a workspace's icon can never stand in for someone. Kept five minutes, public like the profile. Agents, the product tour's people, "someone" and workspaces' square avatars are never looked up (image null), so an account with the same name never lends them its face. | 107 | <Skeleton className="h-68 rounded-xl" /> |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 108 | <Skeleton className="mt-3 h-8 w-44 rounded-md" /> |
| 109 | </div> | |
| 110 | )} | |
| 111 | </div> | |
| 112 | ))} | |
| 113 | </div> | |
| The site is built from its shared components: one Button with its variants and sizes, one Badge, Card for every panel, Alert for notices, Kbd for keys, Table for the security tables, and Avatar, Command, Progress, ScrollArea, ToggleGroup, Collapsible and Accordion in the kit; raw buttons, hand-drawn cards and pills and per-file button class lists are gone, outline buttons stand the same height as filled ones, and the phone's Ask g1t loses its tile. Every page was compared pixel by pixel before and after. | 114 | </Card> |
| Merge the workspace shell: navigation and phone shell, g1t as orchestrator, agents in roles with audience-checked reads, reactions and custom emoji, live notifications and browser push, the homepage tour (agents 0002, chat 0002) | 115 | <div className="space-y-6"> |
| 116 | <SkeletonCard lines={0} className="h-80 p-5" /> | |
| 117 | <SkeletonCard lines={6} className="p-5" /> | |
| 118 | </div> | |
| 119 | </div> | |
| 120 | </main> | |
| 121 | ); | |
| 122 | } |
This file's history is long; its oldest lines are credited to the oldest commit read.