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.
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 1 | /** |
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 2 | * A workspace's pages and where the sidebar finds them. `g1t.sh/<workspace>` |
| 3 | * is the workspace's own page, its header and overview; Projects, Packages, | |
| 4 | * Teams, People, Insights and Settings are pages of their own under `-/`, | |
| 5 | * each reached from the sidebar and each with its own heading. The sidebar | |
| 6 | * is always the current workspace's. | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 7 | */ |
| 8 | ||
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 9 | /** The workspace's pages a person moves between, and which the sidebar lists. */ |
| 10 | export type WorkspacePageKey = "overview" | "projects" | "packages" | "teams" | "people" | "insights"; | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 11 | |
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 12 | /** Those pages under `-/`: the overview is the workspace's own address. */ |
| 13 | export const WORKSPACE_PAGES = ["projects", "packages", "teams", "people", "insights"] as const; | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 14 | |
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 15 | /** |
| 16 | * Which of those pages a path is, under `/<workspace>`: null for the | |
| Agents mode: an overview of every agent's work and spend, and each agent's sessions, memory, routines, spend, activity and versions | 17 | * workspace's other pages (settings, Usage and the rest), for |
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 18 | * one package's or one team's page, and for anything else. |
| 19 | */ | |
| 20 | export function workspacePage(pathname: string, slug: string): WorkspacePageKey | null { | |
| 21 | const parts = pagePath(pathname).split("/").filter(Boolean); | |
| 22 | if (parts[0]?.toLowerCase() !== slug.toLowerCase()) return null; | |
| 23 | if (parts.length === 1) return "overview"; | |
| 24 | if (parts[1] !== "-" || parts.length !== 3) return null; | |
| 25 | return (WORKSPACE_PAGES as readonly string[]).includes(parts[2]!) ? (parts[2] as WorkspacePageKey) : null; | |
| 26 | } | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 27 | |
| The Runners page shows the machines a workspace's agents and workflow jobs run on, in Workspace under Compute: g1t's cloud beside your own runners, what each is running now with a link to it, what's waiting, this month's machine time and its cost (your own runners' free), where agent work and workflow jobs run, adding a runner, and groups; runner_activity in Actions says what runs where, work handed to your runners keeps its agent run, and the self-hosted runners guide says how. | 28 | /** |
| Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now. | 29 | * Workspace mode's pages, in the groups its sidebar lists them under: the |
| 30 | * workspace's settings area, every page one click away. `owner` marks the | |
| 31 | * pages only owners open; the sidebar shows members the rest. A page that | |
| 32 | * is not here yet is a `soon` row: what the group will hold, not a link. | |
| 33 | * `path` is under `-/`. | |
| The Runners page shows the machines a workspace's agents and workflow jobs run on, in Workspace under Compute: g1t's cloud beside your own runners, what each is running now with a link to it, what's waiting, this month's machine time and its cost (your own runners' free), where agent work and workflow jobs run, adding a runner, and groups; runner_activity in Actions says what runs where, work handed to your runners keeps its agent run, and the self-hosted runners guide says how. | 34 | */ |
| Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now. | 35 | export type WorkspaceSettingsPage = { key: string; label: string; path: string; owner?: boolean; soon?: string }; |
| 36 | ||
| 37 | export type WorkspaceSettingsGroup = { key: string; title: string; pages: WorkspaceSettingsPage[] }; | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 38 | |
| Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now. | 39 | export const WORKSPACE_SETTINGS_GROUPS: readonly WorkspaceSettingsGroup[] = [ |
| 40 | { | |
| 41 | key: "general", | |
| 42 | title: "General", | |
| 43 | pages: [{ key: "settings", label: "General", path: "settings", owner: true }], | |
| 44 | }, | |
| 45 | { | |
| 46 | key: "access", | |
| 47 | title: "Access", | |
| 48 | pages: [ | |
| 49 | { key: "members", label: "Members", path: "members" }, | |
| 50 | { key: "invitations", label: "Invitations", path: "members/invitations", owner: true }, | |
| 51 | { key: "permissions", label: "Permissions", path: "permissions", owner: true }, | |
| 52 | { key: "tokens", label: "Access tokens", path: "tokens" }, | |
| 53 | { key: "personal-access-tokens", label: "Personal access tokens", path: "personal-access-tokens", owner: true }, | |
| 54 | ], | |
| 55 | }, | |
| 56 | { | |
| 57 | key: "money", | |
| 58 | title: "Money", | |
| 59 | pages: [ | |
| 60 | { key: "spend", label: "Spend", path: "spend" }, | |
| 61 | { key: "usage", label: "Usage", path: "usage" }, | |
| 62 | { key: "gateway", label: "AI Gateway", path: "gateway" }, | |
| 63 | { key: "billing", label: "Billing and plans", path: "billing" }, | |
| 64 | ], | |
| 65 | }, | |
| 66 | { | |
| 67 | key: "compute", | |
| 68 | title: "Compute", | |
| 69 | pages: [{ key: "runners", label: "Runners", path: "runners", owner: true }], | |
| 70 | }, | |
| 71 | { | |
| 72 | key: "code", | |
| 73 | title: "Code", | |
| 74 | pages: [ | |
| 75 | { key: "repositories", label: "Repositories", path: "repositories" }, | |
| 76 | { key: "actions", label: "Actions", path: "actions" }, | |
| 77 | { key: "secrets", label: "Secrets and variables", path: "secrets" }, | |
| 78 | { key: "webhooks", label: "Webhooks", path: "webhooks" }, | |
| 79 | { | |
| 80 | key: "deployments", | |
| 81 | label: "Deployments", | |
| 82 | path: "soon/deployments", | |
| 83 | soon: "Defaults for every project's deployments: environments, who approves production, and the domains the workspace owns.", | |
| 84 | }, | |
| 85 | { | |
| 86 | key: "projects", | |
| 87 | label: "Project defaults", | |
| 88 | path: "soon/projects", | |
| 89 | soon: "What a new project starts with: its visibility, branch rules, merge method and the agents on it.", | |
| 90 | }, | |
| 91 | ], | |
| 92 | }, | |
| 93 | { | |
| 94 | key: "agents", | |
| 95 | title: "Agents", | |
| 96 | pages: [ | |
| 97 | { | |
| 98 | key: "agent-settings", | |
| 99 | label: "Agent settings", | |
| 100 | path: "soon/agent-settings", | |
| 101 | soon: "Budgets and the models agents may use are on the Agents overview today; who may create agents is under Permissions.", | |
| 102 | }, | |
| 103 | ], | |
| 104 | }, | |
| 105 | { | |
| 106 | key: "chat", | |
| 107 | title: "Chat", | |
| 108 | pages: [ | |
| 109 | { key: "chat-settings", label: "Chat settings", path: "settings/chat" }, | |
| 110 | { key: "emoji", label: "Emoji", path: "emoji" }, | |
| 111 | ], | |
| 112 | }, | |
| 113 | { | |
| 114 | key: "artifacts", | |
| 115 | title: "Artifacts", | |
| 116 | pages: [ | |
| 117 | { | |
| 118 | key: "artifact-settings", | |
| 119 | label: "Spaces and sharing", | |
| 120 | path: "soon/artifact-settings", | |
| 121 | soon: "Which spaces a workspace starts with, and how a new artifact is shared by default.", | |
| 122 | }, | |
| 123 | ], | |
| 124 | }, | |
| 125 | { | |
| 126 | key: "security", | |
| 127 | title: "Security", | |
| 128 | pages: [ | |
| 129 | { key: "security-settings", label: "Security settings", path: "security/settings" }, | |
| 130 | { key: "guardrails", label: "Guardrails", path: "guardrails" }, | |
| 131 | { key: "rules", label: "Rules", path: "rules" }, | |
| 132 | { key: "audit", label: "Audit log", path: "audit" }, | |
| 133 | ], | |
| 134 | }, | |
| 135 | { | |
| 136 | key: "integrations", | |
| 137 | title: "Integrations", | |
| 138 | pages: [ | |
| 139 | { key: "integrations", label: "Integrations", path: "integrations" }, | |
| 140 | { | |
| 141 | key: "applications", | |
| 142 | label: "Applications", | |
| 143 | path: "soon/applications", | |
| 144 | soon: "OAuth applications the workspace registers, and the ones it lets its members authorize.", | |
| 145 | }, | |
| 146 | ], | |
| 147 | }, | |
| 148 | ]; | |
| 149 | ||
| 150 | /** | |
| 151 | * Which of Workspace mode's pages `pathname` is, under the workspace | |
| 152 | * `slug`, as a group key and a page key; null for the overview and for | |
| 153 | * anything else. A page's own subpages (one ruleset, a receipt) count as | |
| 154 | * the page; the deepest match wins, so Invitations is its own page and | |
| 155 | * not a subpage of Members. | |
| 156 | */ | |
| 157 | export function workspaceSettingsPage(pathname: string, slug: string): { group: string; page: string } | null { | |
| 158 | const parts = pagePath(pathname).split("/").filter(Boolean); | |
| 159 | if (parts[0]?.toLowerCase() !== slug.toLowerCase() || parts[1] !== "-") return null; | |
| 160 | const rest = parts.slice(2).join("/"); | |
| 161 | let found: { group: string; page: string; depth: number } | null = null; | |
| 162 | for (const group of WORKSPACE_SETTINGS_GROUPS) { | |
| 163 | for (const page of group.pages) { | |
| 164 | if (page.soon) continue; | |
| 165 | if (rest === page.path || rest.startsWith(`${page.path}/`)) { | |
| 166 | const depth = page.path.split("/").length; | |
| 167 | if (!found || depth > found.depth) found = { group: group.key, page: page.key, depth }; | |
| 168 | } | |
| 169 | } | |
| 170 | } | |
| 171 | return found ? { group: found.group, page: found.page } : null; | |
| 172 | } | |
| 173 | ||
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 174 | /** `?tab=` as people write it, from the tabs the workspace page once had: the page it means. */ |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 175 | const TAB_WORDS: Record<string, string> = { |
| 176 | overview: "", | |
| 177 | projects: "-/projects", | |
| 178 | repositories: "-/projects", | |
| 179 | repos: "-/projects", | |
| 180 | packages: "-/packages", | |
| 181 | people: "-/people", | |
| People and teams are front and centre: one directory of people and agents with presence, local time, titles, teams and what each owns; profiles with manager and reports and the agents they work with; an org chart with each team's agents beside the person who leads it; and teams of any mix, with a lead, a channel, a budget agents keep to and the agents on them. Every agent is told its teams each turn (who leads, who owns what, who's around and who to page), and the team page shows exactly what. Member management is Members and invites; the people and teams guide says how. | 182 | members: "-/members", |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 183 | teams: "-/teams", |
| 184 | insights: "-/insights", | |
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 185 | settings: "-/settings", |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 186 | }; |
| 187 | ||
| 188 | /** Workspace pages that moved, by their old name under `-/`. */ | |
| 189 | const MOVED: Record<string, string> = { | |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 190 | // Home was called Today for a while. |
| 191 | today: "-/home", | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 192 | "soon/teams": "-/teams", |
| 193 | "soon/insights": "-/insights", | |
| 194 | }; | |
| 195 | ||
| The Marketplace adds what g1t doesn't do and connects what you already use: extensions (Mail, Support, CRM, Recruiting, On-call, and bridges to a helpdesk, CRM or ERP you run, all Soon), starter kits, and integrations connected by the workspace or by each person; agents aren't installed there. Agent templates live in Agents, as starting points you configure, at Agents → Templates, and the Marketplace's old agent addresses lead there. The marketplace and agents guides say how. | 196 | /** Workspace pages that moved with everything under them, by their old name under `-/`: the rest of the path follows. */ |
| 197 | const MOVED_UNDER: Record<string, string> = { | |
| 198 | // Agent templates were the Marketplace's Agents tab. | |
| 199 | "marketplace/agents": "-/agents/templates", | |
| 200 | }; | |
| 201 | ||
| Billing: credits with a kind and expiry, discounts instead of comped, and safer charging | 202 | /** The page a request is for: a click's data request ends in `.data`. */ |
| 203 | export function pagePath(pathname: string): string { | |
| 204 | return pathname.replace(/\.data$/, "").replace(/\/+$/, "") || "/"; | |
| 205 | } | |
| 206 | ||
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 207 | /** |
| Merge branch 'worktree-agent-a8385d293d42c913a' | 208 | * The page at `pathname` under the workspace `slug` instead of its first |
| 209 | * segment, keeping its query: where an old name or an alias leads. A click | |
| 210 | * asks for the page's data at `<path>.data?_routes=…`; the address given is | |
| 211 | * the page's own, which the browser then asks for as usual. | |
| 212 | */ | |
| 213 | export function underWorkspace(pathname: string, search: string, slug: string): string { | |
| 214 | const params = new URLSearchParams(search); | |
| 215 | params.delete("_routes"); | |
| 216 | const query = params.toString(); | |
| 217 | const segments = pagePath(pathname).split("/"); | |
| 218 | // segments[0] is the empty string before the leading slash. | |
| 219 | segments[1] = slug; | |
| 220 | return `${segments.join("/")}${query ? `?${query}` : ""}`; | |
| 221 | } | |
| 222 | ||
| 223 | /** | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 224 | * Where an old address of a workspace's pages is now, keeping its query; |
| 225 | * null when it has not moved. `/<workspace>?tab=projects` and the like | |
| Merge branch 'worktree-agent-ad7c6d88d93adc817' | 226 | * open that page. |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 227 | */ |
| 228 | export function workspaceRedirect(pathname: string, search = ""): string | null { | |
| Billing: credits with a kind and expiry, discounts instead of comped, and safer charging | 229 | // A click asks for the page's data at `<path>.data?_routes=…`; the page |
| 230 | // is the same one a full load asks for. | |
| 231 | const params = new URLSearchParams(search); | |
| 232 | params.delete("_routes"); | |
| 233 | search = params.toString(); | |
| 234 | const parts = pagePath(pathname).split("/").filter(Boolean); | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 235 | const slug = parts[0]; |
| 236 | if (!slug) return null; | |
| 237 | if (parts.length === 1 && params.has("tab")) { | |
| 238 | const to = TAB_WORDS[(params.get("tab") ?? "").toLowerCase()]; | |
| 239 | if (to === undefined) return null; | |
| 240 | params.delete("tab"); | |
| 241 | const rest = params.toString(); | |
| 242 | return `/${slug}${to ? `/${to}` : ""}${rest ? `?${rest}` : ""}`; | |
| 243 | } | |
| 244 | if (parts[1] !== "-") return null; | |
| The Marketplace adds what g1t doesn't do and connects what you already use: extensions (Mail, Support, CRM, Recruiting, On-call, and bridges to a helpdesk, CRM or ERP you run, all Soon), starter kits, and integrations connected by the workspace or by each person; agents aren't installed there. Agent templates live in Agents, as starting points you configure, at Agents → Templates, and the Marketplace's old agent addresses lead there. The marketplace and agents guides say how. | 245 | const rest = parts.slice(2).join("/"); |
| 246 | const under = Object.keys(MOVED_UNDER).find((from) => rest === from || rest.startsWith(`${from}/`)); | |
| 247 | const to = under ? `${MOVED_UNDER[under]}${rest.slice(under.length)}` : MOVED[rest]; | |
| Navigation: the workspace's own page with tabs, pins and recent in the sidebar | 248 | if (to === undefined) return null; |
| 249 | return `/${slug}${to ? `/${to}` : ""}${search && search !== "?" ? (search.startsWith("?") ? search : `?${search}`) : ""}`; | |
| 250 | } | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 251 | |
| 252 | /** | |
| The left-hand navigation takes less room and reads at a glance. The dock becomes a rail: a 56-pixel column of icons with the g1t mark on top, the current app marked by a filled square, hover hints naming each with its shortcut, the apps you pinned in a scrolling band, and Apps, People, Workspace and your account at the foot. Each mode's sidebar sits flush against it, 240 pixels wide, opening on Search or jump to and listing its groups under small labels in 36-pixel rows; Ctrl B hides it and the page grows into the room. Every mode's list is built on the shadcn Sidebar now in the kit, so Workspace, Code, People, Notifications, account settings, Chat, Artifacts and Agents all share one frame; the phone keeps its bottom bar and drawer. The workspaces guide describes the rail, the sidebar and the page. | 253 | * The rail's modes. Home is the front page; |
| 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. | 254 | * Chat, Agents, Code and Artifacts are where work happens; Notifications |
| Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now. | 255 | * spans them; People is who belongs; Workspace is the workspace itself, |
| 256 | * its settings area: who has access, money, policies and how each part is | |
| 257 | * set up; Apps is everything installed that you | |
| 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. | 258 | * can use. `account` is your own settings, under the avatar. `site` is |
| 259 | * g1t's own public pages (a profile, Explore, Search): no workspace's, so | |
| 260 | * no mode is lit and no mode's sidebar sits beside them. Each mode has a | |
| 261 | * sidebar of its own, or none, and which one is lit follows the address. | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 262 | */ |
| 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. | 263 | export type ModeKey = |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 264 | | "home" |
| 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. | 265 | | "chat" |
| 266 | | "notifications" | |
| 267 | | "agents" | |
| 268 | | "code" | |
| 269 | | "artifacts" | |
| 270 | | "people" | |
| 271 | | "workspace" | |
| 272 | | "apps" | |
| 273 | | "account" | |
| 274 | | "site"; | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 275 | |
| 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) | 276 | /** Workspace pages under `-/`, by the mode they belong to. Anything else of the workspace's is Code's. */ |
| 277 | const PAGE_MODES: Record<string, ModeKey> = { | |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 278 | home: "home", |
| 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) | 279 | chat: "chat", |
| Artifacts is a mode in the rail, the shell and the phone's tab bar in place of Docs: its home lists everything you can open by day or as cards under All, Yours and Shared with you, with search, filters and tiles to start a doc (slides, designs and dashboards say they are coming soon), and its sidebar holds favorites, spaces, Private, Shared, projects' docs and the trash. | 280 | artifacts: "artifacts", |
| 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) | 281 | agents: "agents", |
| 282 | context: "agents", | |
| 283 | memory: "agents", | |
| 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. | 284 | apps: "apps", |
| 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. | 285 | marketplace: "apps", |
| 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. | 286 | people: "people", |
| Workspace is the workspace's settings, in one place. Its sidebar is grouped, General, Access, Money, Compute, Code, Agents, Chat, Artifacts, Security and Integrations, every page one click away with no settings inside settings, the groups folding and the owner-only pages hidden from members; what is not here yet is marked Soon with a hint. Members is a list with search and filters for role, two-factor and team, and Invite opens a dialog: who, by username, name or email, their role and a note that goes into the invitation; nothing is filled in inline any more. Invitations is its own page with All, Pending, Accepted, Declined, Expired and Revoked filters that say how many, and each row's menu can copy the link, send it again or revoke it; identity learned to send an invitation again and to carry the note. Permissions gathers every rule about who may do what, by part: Code's base permission and member privileges, who creates teams, who creates channels, and, marked Soon with what applies today, forking private repositories, adding agents to conversations, messaging agents directly, creating spaces and default sharing, creating workspace agents and raising budgets, deploying to production and publishing packages. General lost what moved. The permissions guide is new, and the workspaces, people and teams, access, chat, teams, authentication and billing guides say where things are now. | 287 | members: "workspace", |
| 288 | permissions: "workspace", | |
| 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. | 289 | teams: "people", |
| People and teams are front and centre: one directory of people and agents with presence, local time, titles, teams and what each owns; profiles with manager and reports and the agents they work with; an org chart with each team's agents beside the person who leads it; and teams of any mix, with a lead, a channel, a budget agents keep to and the agents on them. Every agent is told its teams each turn (who leads, who owns what, who's around and who to page), and the team page shows exactly what. Member management is Members and invites; the people and teams guide says how. | 290 | "org-chart": "people", |
| 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) | 291 | workspace: "workspace", |
| The Spend page says what a workspace spent, where it went and the budgets that hold it, in Workspace under Money: spent at price, agents' spend and the spend limit; by day; by agent, person, channel, model, kind of work and product; budgets from the workspace down to each person, agent and task, with what happens at 100%; the costliest tasks, each with a receipt of every session at the provider's price and what was charged; and how it's priced. Everyone sees what agents spent for them, and owners and billing managers the whole workspace; each person can have a monthly budget agents keep to, and the spend pill in the top bar shows your month or the workspace's against its limit. The spend guide says how. | 292 | spend: "workspace", |
| 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) | 293 | usage: "workspace", |
| 294 | gateway: "workspace", | |
| 295 | billing: "workspace", | |
| 296 | integrations: "workspace", | |
| 297 | guardrails: "workspace", | |
| 298 | rules: "workspace", | |
| 299 | audit: "workspace", | |
| 300 | settings: "workspace", | |
| 301 | repositories: "workspace", | |
| 302 | tokens: "workspace", | |
| 303 | "personal-access-tokens": "workspace", | |
| 304 | secrets: "workspace", | |
| 305 | actions: "workspace", | |
| 306 | runners: "workspace", | |
| 307 | webhooks: "workspace", | |
| 308 | emoji: "workspace", | |
| 309 | }; | |
| 310 | ||
| Chat controls, public profiles, shadcn selects, and no Docs tab in a project | 311 | /** First segments that are g1t's own pages, never a workspace: none is any mode's. */ |
| 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) | 312 | const SITE_PAGES = new Set(["explore", "search", "support", "policies", "security", "status", "u", "invite", "workspaces"]); |
| 313 | ||
| 314 | /** | |
| 315 | * The mode a path is in, for the workspace `slug`. A repository (anyone's) | |
| 316 | * and a new project are Code's; g1t's own pages (Explore, search, a | |
| Chat controls, public profiles, shadcn selects, and no Docs tab in a project | 317 | * profile) are `site`: public, and no workspace's mode. |
| 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) | 318 | */ |
| Chat and workspace agents: channels, DMs and named agents you talk to | 319 | export function modeOf(pathname: string, slug: string | null): ModeKey { |
| 320 | const path = pagePath(pathname); | |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 321 | if (path === "/") return "home"; |
| 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. | 322 | if (path === "/notifications" || path.startsWith("/notifications/")) return "notifications"; |
| 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) | 323 | if (path === "/settings" || path.startsWith("/settings/")) return "account"; |
| Chat and workspace agents: channels, DMs and named agents you talk to | 324 | const parts = path.split("/").filter(Boolean); |
| Chat controls, public profiles, shadcn selects, and no Docs tab in a project | 325 | if (SITE_PAGES.has(parts[0] ?? "")) return "site"; |
| 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) | 326 | if (slug && parts[0]?.toLowerCase() === slug.toLowerCase()) { |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 327 | if (parts.length === 1) return "home"; |
| 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) | 328 | if (parts[1] === "-") { |
| 329 | // The workspace's security settings are a policy; its alerts are Code's. | |
| 330 | if (parts[2] === "security" && parts[3] === "settings") return "workspace"; | |
| 331 | return PAGE_MODES[parts[2] ?? ""] ?? "code"; | |
| 332 | } | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 333 | } |
| 334 | return "code"; | |
| 335 | } | |
| 336 | ||
| The left-hand navigation takes less room and reads at a glance. The dock becomes a rail: a 56-pixel column of icons with the g1t mark on top, the current app marked by a filled square, hover hints naming each with its shortcut, the apps you pinned in a scrolling band, and Apps, People, Workspace and your account at the foot. Each mode's sidebar sits flush against it, 240 pixels wide, opening on Search or jump to and listing its groups under small labels in 36-pixel rows; Ctrl B hides it and the page grows into the room. Every mode's list is built on the shadcn Sidebar now in the kit, so Workspace, Code, People, Notifications, account settings, Chat, Artifacts and Agents all share one frame; the phone keeps its bottom bar and drawer. The workspaces guide describes the rail, the sidebar and the page. | 337 | /** Where each mode's button in the rail goes, in the workspace `slug`. */ |
| 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) | 338 | export function modeHome(mode: ModeKey, slug: string): string { |
| Chat and workspace agents: channels, DMs and named agents you talk to | 339 | switch (mode) { |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 340 | case "home": |
| 341 | return homePagePath(slug); | |
| 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. | 342 | case "notifications": |
| 343 | return "/notifications"; | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 344 | case "chat": |
| 345 | return `/${slug}/-/chat`; | |
| Artifacts is a mode in the rail, the shell and the phone's tab bar in place of Docs: its home lists everything you can open by day or as cards under All, Yours and Shared with you, with search, filters and tiles to start a doc (slides, designs and dashboards say they are coming soon), and its sidebar holds favorites, spaces, Private, Shared, projects' docs and the trash. | 346 | case "artifacts": |
| 347 | return `/${slug}/-/artifacts`; | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 348 | case "agents": |
| 349 | return `/${slug}/-/agents`; | |
| 350 | case "code": | |
| 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) | 351 | return `/${slug}/-/overview`; |
| 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. | 352 | case "people": |
| 353 | return `/${slug}/-/people`; | |
| 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) | 354 | case "workspace": |
| 355 | return `/${slug}/-/workspace`; | |
| 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. | 356 | case "apps": |
| 357 | return `/${slug}/-/apps`; | |
| 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) | 358 | case "account": |
| 359 | return "/settings"; | |
| Chat controls, public profiles, shadcn selects, and no Docs tab in a project | 360 | case "site": |
| 361 | return "/explore"; | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 362 | } |
| 363 | } | |
| 364 | ||
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 365 | /** A workspace's front page: Home. */ |
| 366 | export function homePagePath(slug: string): string { | |
| 367 | return `/${slug}/-/home`; | |
| 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. | 368 | } |
| 369 | ||
| 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) | 370 | /** |
| 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. | 371 | * Where g1t's front door (`/`) and a workspace's own address lead someone |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 372 | * in the workspace `slug`: Home, or Code's Overview when the query asks |
| 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. | 373 | * for its panels (a tab, or `?agent=new` to put an agent on something). |
| 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) | 374 | */ |
| 375 | export function homePath(slug: string, search = ""): string { | |
| 376 | const params = new URLSearchParams(search); | |
| 377 | params.delete("_routes"); | |
| 378 | params.delete("index"); | |
| 379 | const query = params.toString(); | |
| 380 | if (params.has("agent") || params.has("tab") || params.has("sort")) return `/${slug}/-/overview?${query}`; | |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 381 | return homePagePath(slug); |
| 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) | 382 | } |
| 383 | ||
| Chat and workspace agents: channels, DMs and named agents you talk to | 384 | /** The page a member without Code access sees in place of anything of Code's. */ |
| 385 | export function codeAccessPath(slug: string, from?: string): string { | |
| 386 | return `/${slug}/-/code-access${from ? `?from=${encodeURIComponent(from)}` : ""}`; | |
| 387 | } | |
| 388 | ||
| 389 | /** The workspace pages under `-/` that are Code's: closed to a member without Code access. */ | |
| 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) | 390 | const CODE_PAGES = new Set(["overview", "projects", "repositories", "packages", "security", "rules", "runners", "actions", "context", "memory", "insights", "soon"]); |
| Chat and workspace agents: channels, DMs and named agents you talk to | 391 | |
| 392 | /** | |
| 393 | * Where a member without Code access goes instead of `pathname`, or null | |
| 394 | * when the page is open to them. `noCode` is the workspaces (by slug) where | |
| 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. | 395 | * they lack it; `chosen` is the one they are in. g1t's front door (`/`) is |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 396 | * Home in that workspace, and so is the workspace's own address; its |
| 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. | 397 | * Code pages and every repository page is the page that says to ask an |
| 398 | * owner. | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 399 | */ |
| 400 | export function codeGate(pathname: string, search: string, noCode: readonly string[], chosen: string | null): string | null { | |
| 401 | if (noCode.length === 0) return null; | |
| 402 | const path = pagePath(pathname); | |
| 403 | if (path === "/") { | |
| 404 | const slug = chosen && noCode.includes(chosen.toLowerCase()) ? chosen.toLowerCase() : null; | |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 405 | return slug ? homePagePath(slug) : null; |
| Chat and workspace agents: channels, DMs and named agents you talk to | 406 | } |
| 407 | const parts = path.split("/").filter(Boolean); | |
| 408 | const slug = parts[0]?.toLowerCase(); | |
| 409 | if (!slug || !noCode.includes(slug)) return null; | |
| 410 | const from = `${path}${search && search !== "?" ? search : ""}`; | |
| The front page is Home: where you're needed comes first, however long ago it started, with what's at stake and how long it has waited; then what happened since you were last here, in words, with the agent work that settled, what landed, what deployed, what was decided and what was spent, switchable to the last 24 hours or 7 days; then what's running now. Your last visit is kept with your account, so it's the same on every device; Today's old address leads here. The home guide says how. | 411 | // The workspace's own page is Home. |
| 412 | if (parts.length === 1) return homePagePath(slug); | |
| Chat and workspace agents: channels, DMs and named agents you talk to | 413 | if (parts[1] === "-") return CODE_PAGES.has(parts[2] ?? "") ? codeAccessPath(slug, from) : null; |
| 414 | // A repository, and everything in it. | |
| 415 | return codeAccessPath(slug, from); | |
| 416 | } |
This file's history is long; its oldest lines are credited to the oldest commit read.