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

Docs: usage is shown at cost while g1t is free1const ALPHABET = "0123456789abcdefghjkmnpqrstvwxyz";
2
Each agent has an Abilities tab: g1t's built-ins, always on within the asker's access; its computer, coming; each connected integration's actions one row each, read, import, comment or resolve, with a level for each, alone, alone when the person asked for it, ask first or never, and whose connection it runs on; and MCP servers an owner adds. Reading is alone, writing inside g1t follows today's choices, anything that leaves g1t asks first, and production deploys can't go above ask. The agents service enforces every level: ask first posts a card to allow or deny and parks a session until it's answered, a refusal names its rule in the transcript and the audit log, and a missing ability posts a request to owners. The agent abilities guide says how.3export type IdPrefix = "usr" | "ses" | "tok" | "key" | "rep" | "int" | "att" | "evt" | "dpl" | "prj" | "dom" | "dep" | "dst" | "chn" | "msg" | "agt" | "arp" | "asn" | "mem" | "rtn" | "drf" | "spc" | "pag" | "ver" | "thr" | "cmt" | "sug" | "tpl" | "fil" | "rds" | "fol" | "prp" | "ins" | "skl" | "ska" | "abr" | "mcp";
Docs: usage is shown at cost while g1t is free4
5let lastMs = 0;
6let lastCounter = 0;
7
8/**
9 * A new id in TypeID format (https://github.com/jetify-com/typeid): a type
10 * prefix, then a UUIDv7 in lowercase Crockford base32, such as
11 * `att_01jb2k7x9hfq0b3zj0f5s2m8ra`. Sorting ids as strings sorts them by
12 * creation time. Must stay identical to `new_id` in crates/contracts.
13 */
14export function newId(prefix: IdPrefix, now: number = Date.now()): string {
15 const bytes = crypto.getRandomValues(new Uint8Array(16));
16
17 // Ids made in the same millisecond count up in the 12-bit rand_a field.
18 const counter =
19 now === lastMs
20 ? (lastCounter + 1) & 0x0fff
21 : ((bytes[6] << 8) | bytes[7]) & 0x07ff;
22 lastMs = now;
23 lastCounter = counter;
24
25 const time = BigInt(now);
26 for (let i = 0; i < 6; i++) {
27 bytes[i] = Number((time >> BigInt(40 - 8 * i)) & 0xffn);
28 }
29 bytes[6] = 0x70 | (counter >> 8); // version 7
30 bytes[7] = counter & 0xff;
31 bytes[8] = 0x80 | (bytes[8] & 0x3f); // RFC 9562 variant
32
33 let value = 0n;
34 for (const byte of bytes) value = (value << 8n) | BigInt(byte);
35 let suffix = "";
36 // 128 bits in 26 characters of 5 bits; the first carries only 3.
37 for (let i = 0; i < 26; i++) {
38 suffix += ALPHABET[Number((value >> BigInt(125 - 5 * i)) & 31n)];
39 }
40 return `${prefix}_${suffix}`;
41}

This file's history is long; its oldest lines are credited to the oldest commit read.