run402 4.70.9 → 4.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/gitvault-surface.json +1 -1
  2. package/lib/cold-start.mjs +33 -7
  3. package/lib/command-manifest.mjs +8 -1
  4. package/lib/org-context.mjs +8 -2
  5. package/lib/rooms-context.mjs +14 -3
  6. package/lib/rooms.mjs +299 -2
  7. package/lib/sdk-errors.mjs +25 -0
  8. package/package.json +1 -1
  9. package/sdk/dist/namespaces/rooms.d.ts +53 -1
  10. package/sdk/dist/namespaces/rooms.d.ts.map +1 -1
  11. package/sdk/dist/namespaces/rooms.js +130 -0
  12. package/sdk/dist/namespaces/rooms.js.map +1 -1
  13. package/sdk/dist/namespaces/rooms.types.d.ts +94 -0
  14. package/sdk/dist/namespaces/rooms.types.d.ts.map +1 -1
  15. package/sdk/dist/node/bearer-claim-key.d.ts +126 -0
  16. package/sdk/dist/node/bearer-claim-key.d.ts.map +1 -0
  17. package/sdk/dist/node/bearer-claim-key.js +209 -0
  18. package/sdk/dist/node/bearer-claim-key.js.map +1 -0
  19. package/sdk/dist/node/gitvault-address.d.ts +19 -0
  20. package/sdk/dist/node/gitvault-address.d.ts.map +1 -1
  21. package/sdk/dist/node/gitvault-address.js +20 -0
  22. package/sdk/dist/node/gitvault-address.js.map +1 -1
  23. package/sdk/dist/node/gitvault-handoff.d.ts +3 -95
  24. package/sdk/dist/node/gitvault-handoff.d.ts.map +1 -1
  25. package/sdk/dist/node/gitvault-handoff.js +9 -122
  26. package/sdk/dist/node/gitvault-handoff.js.map +1 -1
  27. package/sdk/dist/node/index.d.ts +3 -1
  28. package/sdk/dist/node/index.d.ts.map +1 -1
  29. package/sdk/dist/node/index.js +8 -1
  30. package/sdk/dist/node/index.js.map +1 -1
  31. package/sdk/dist/node/paid-fetch.d.ts +8 -0
  32. package/sdk/dist/node/paid-fetch.d.ts.map +1 -1
  33. package/sdk/dist/node/paid-fetch.js +41 -1
  34. package/sdk/dist/node/paid-fetch.js.map +1 -1
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Bearer-claim key format — the pure, kind-agnostic primitives shared by
3
+ * every bearer-addressed membership claim key this SDK mints or parses
4
+ * (add-room-invite design D2/D3, mirroring the gateway's own
5
+ * `services/bearer-claim-key.ts`).
6
+ *
7
+ * Through kygit-invite this lived inline in `gitvault-handoff.ts`: the key
8
+ * registry (`HANDOFF_KEY_PREFIXES`), `uuidToBytes`, the generic
9
+ * assemble/parse helpers, and the HKDF derivations for `auth_secret` /
10
+ * `wrap_key`. add-room-invite adds a THIRD kind — `room` (`kri1_…`) — whose
11
+ * claim confers org membership rather than vault access and carries no
12
+ * `wrap_key`/envelope/admission-seed at all (design D3). Rather than teach
13
+ * the vault-shaped module a room-shaped kind, the pure key-format
14
+ * primitives move HERE (a move, not a copy — `gitvault-handoff.ts`
15
+ * re-exports every symbol it previously exported, under its existing name,
16
+ * so nothing importing it changes) and gain the room row alongside them.
17
+ * Everything that is genuinely vault-specific — the sealed envelope, the
18
+ * writer-admission grant/acceptance, the Handoff/Invite Note — stays in
19
+ * `gitvault-handoff.ts`, which imports the pieces it needs from here.
20
+ *
21
+ * `HANDOFF_KEY_PREFIXES` is a REGISTRY: `kgh1_` (handoff, `resume`), `kgi1_`
22
+ * (invite, `repos join`), `kri1_` (room, `rooms join`). `parseClaimKey`
23
+ * refuses any other recognized-shape-but-wrong-kind prefix BY NAME, naming
24
+ * the door it actually belongs at, rather than misreading it as a malformed
25
+ * key of the kind the caller expected — never contacting the gateway.
26
+ */
27
+ import { hkdf } from "@noble/hashes/hkdf.js";
28
+ import { sha256 } from "@noble/hashes/sha2.js";
29
+ import { concatBytes, utf8ToBytes } from "@noble/hashes/utils.js";
30
+ import { LocalError } from "../errors.js";
31
+ import { fromBase64url, randomBytes, toBase64url, bytesToHex } from "../namespaces/gitvault.crypto.js";
32
+ function fail(code, message, context, details) {
33
+ throw new LocalError(message, context, { code, details });
34
+ }
35
+ /**
36
+ * `kgh1_` is the first row (handoff); `kgi1_` the second (invite,
37
+ * kygit-invite design D3); `kri1_` the third (room, add-room-invite design
38
+ * D3). A future kind is a SIBLING row here, never a branch on an existing
39
+ * one's parser.
40
+ */
41
+ export const HANDOFF_KEY_PREFIXES = [
42
+ { prefix: "kgh1_", kind: "handoff", verb: "resume", errorPrefix: "HANDOFF", doorLabel: "run402 repos resume", envelopeKind: "kygit-handoff-envelope-v2", noteSchema: "kygit.handoff-note.v1", frameMagic: "KGH1" },
43
+ { prefix: "kgi1_", kind: "invite", verb: "join", errorPrefix: "INVITE", doorLabel: "run402 repos join", envelopeKind: "kygit-invite-envelope-v2", noteSchema: "kygit.invite-note.v1", frameMagic: "KGI1" },
44
+ { prefix: "kri1_", kind: "room", verb: "join", errorPrefix: "ROOM_INVITE", doorLabel: "run402 rooms join" },
45
+ ];
46
+ const HANDOFF_ENTRY = HANDOFF_KEY_PREFIXES[0];
47
+ const INVITE_ENTRY = HANDOFF_KEY_PREFIXES[1];
48
+ const ROOM_ENTRY = HANDOFF_KEY_PREFIXES[2];
49
+ function entryForKind(kind) {
50
+ return kind === "handoff" ? HANDOFF_ENTRY : kind === "invite" ? INVITE_ENTRY : ROOM_ENTRY;
51
+ }
52
+ const CLAIM_ID_BYTES = 16;
53
+ const MASTER_SECRET_BYTES = 32;
54
+ const CLAIM_KEY_BODY_BYTES = CLAIM_ID_BYTES + MASTER_SECRET_BYTES;
55
+ function bytesToUuid(bytes) {
56
+ const h = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
57
+ return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
58
+ }
59
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
60
+ export function uuidToBytes(uuid, field = "handoff_id") {
61
+ if (!UUID_RE.test(uuid))
62
+ fail("HANDOFF_ID_INVALID", `${field} is not a canonical UUID`, "parsing handoff id", { field });
63
+ const hex = uuid.replace(/-/g, "").toLowerCase();
64
+ const out = new Uint8Array(16);
65
+ for (let i = 0; i < 16; i++)
66
+ out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
67
+ return out;
68
+ }
69
+ /** A fresh RFC 4122 v4 UUID — the client-generated claim id every bearer-claim kind mints with (design D3: `auth_secret` derives off it, so it cannot be gateway-assigned). */
70
+ export function randomClaimId() {
71
+ const b = randomBytes(16);
72
+ b[6] = ((b[6] ?? 0) & 0x0f) | 0x40;
73
+ b[8] = ((b[8] ?? 0) & 0x3f) | 0x80;
74
+ return bytesToUuid(b);
75
+ }
76
+ /** Assemble a printed claim key from a fresh 32-byte master secret and the (client-generated or gateway-minted) claim id, for `entry`'s kind. */
77
+ function assembleClaimKey(entry, claimId, masterSecret) {
78
+ if (masterSecret.length !== MASTER_SECRET_BYTES)
79
+ fail(`${entry.errorPrefix}_KEY_INVALID`, "master_secret must be 32 bytes", `assembling ${entry.kind} key`);
80
+ const idBytes = uuidToBytes(claimId, `${entry.kind}_id`);
81
+ const body = concatBytes(idBytes, masterSecret);
82
+ return { key: `${entry.prefix}${toBase64url(body)}`, id_bytes: idBytes, master_secret: masterSecret };
83
+ }
84
+ /**
85
+ * Assemble the printed key from a fresh 32-byte master secret and the
86
+ * gateway-minted `handoff_id`. The gateway never sees `master_secret` — the
87
+ * caller derives `auth_hash` (via {@link deriveHandoffSecrets}) and sends
88
+ * ONLY that.
89
+ */
90
+ export function assembleHandoffKey(handoffId, masterSecret = randomBytes(MASTER_SECRET_BYTES)) {
91
+ const { key, id_bytes, master_secret } = assembleClaimKey(HANDOFF_ENTRY, handoffId, masterSecret);
92
+ return { key, handoff_id_bytes: id_bytes, master_secret };
93
+ }
94
+ /** The invite-kind sibling of {@link assembleHandoffKey} (kygit-invite design D3). */
95
+ export function assembleInviteKey(inviteId, masterSecret = randomBytes(MASTER_SECRET_BYTES)) {
96
+ const { key, id_bytes, master_secret } = assembleClaimKey(INVITE_ENTRY, inviteId, masterSecret);
97
+ return { key, invite_id_bytes: id_bytes, master_secret };
98
+ }
99
+ /**
100
+ * The room-kind sibling of {@link assembleHandoffKey}/{@link assembleInviteKey}
101
+ * (add-room-invite design D3). `invite_id` is CLIENT-generated (unlike the
102
+ * vault kinds, whose id the gateway mints) — the client sends it verbatim in
103
+ * the mint request and the gateway uses it as the row id, refusing a
104
+ * collision with `409 ROOM_INVITE_ID_CONFLICT`.
105
+ */
106
+ export function assembleRoomInviteKey(inviteId, masterSecret = randomBytes(MASTER_SECRET_BYTES)) {
107
+ const { key, id_bytes, master_secret } = assembleClaimKey(ROOM_ENTRY, inviteId, masterSecret);
108
+ return { key, invite_id_bytes: id_bytes, master_secret };
109
+ }
110
+ /**
111
+ * Parse ANY registered claim-family key by its prefix registry against the
112
+ * `expectedKind` the calling verb accepts. A recognized prefix of a
113
+ * DIFFERENT kind (a `kgi1_` invite key handed to `resume`, a `kri1_` room
114
+ * key handed to `repos join`/`resume`, or a `kgi1_`/`kgh1_` vault key handed
115
+ * to `rooms join`) refuses BY NAME pointing at its own door — never misread
116
+ * as a malformed key of the expected kind, and never contacting the gateway
117
+ * (design D9 rule 4 / kygit-invite design D3 / add-room-invite design D3).
118
+ */
119
+ export function parseClaimKey(raw, expectedKind) {
120
+ const expectedEntry = entryForKind(expectedKind);
121
+ const trimmed = raw.trim();
122
+ const entry = HANDOFF_KEY_PREFIXES.find((e) => trimmed.startsWith(e.prefix));
123
+ if (!entry) {
124
+ fail(`${expectedEntry.errorPrefix}_KEY_INVALID`, `not a recognized run402 claim key (expected a key starting ${expectedEntry.prefix})`, "parsing claim key");
125
+ }
126
+ if (entry.kind !== expectedKind) {
127
+ fail(`${expectedEntry.errorPrefix}_KEY_WRONG_KIND`, `this key is a ${entry.kind} key — use \`${entry.doorLabel}\` instead of \`${expectedEntry.doorLabel}\``, "parsing claim key", { kind: entry.kind, verb: entry.verb });
128
+ }
129
+ const body = trimmed.slice(entry.prefix.length);
130
+ let bytes;
131
+ try {
132
+ bytes = fromBase64url(body, `${entry.kind} key body`);
133
+ }
134
+ catch {
135
+ fail(`${entry.errorPrefix}_KEY_INVALID`, "the key body is not valid base64url", "parsing claim key");
136
+ }
137
+ if (bytes.length !== CLAIM_KEY_BODY_BYTES) {
138
+ fail(`${entry.errorPrefix}_KEY_INVALID`, `the key decodes to ${bytes.length} bytes; expected ${CLAIM_KEY_BODY_BYTES}`, "parsing claim key");
139
+ }
140
+ const idBytes = bytes.subarray(0, CLAIM_ID_BYTES);
141
+ const masterSecret = bytes.subarray(CLAIM_ID_BYTES);
142
+ return { kind: entry.kind, id_bytes: idBytes, id: bytesToUuid(idBytes), master_secret: masterSecret };
143
+ }
144
+ /**
145
+ * Parse ANY registered claim-family key by its prefix registry. A
146
+ * recognized prefix of a DIFFERENT kind (an invite or room key handed to
147
+ * `resume`) refuses BY NAME pointing at its own door — never misread as a
148
+ * malformed handoff key (design D9 rule 4). Kind-bound alias of
149
+ * {@link parseClaimKey}.
150
+ */
151
+ export function parseHandoffKey(raw) {
152
+ const parsed = parseClaimKey(raw, "handoff");
153
+ return { kind: "handoff", handoff_id_bytes: parsed.id_bytes, handoff_id: parsed.id, master_secret: parsed.master_secret };
154
+ }
155
+ /** The invite-kind sibling of {@link parseHandoffKey} (kygit-invite design D3). */
156
+ export function parseInviteKey(raw) {
157
+ const parsed = parseClaimKey(raw, "invite");
158
+ return { kind: "invite", invite_id_bytes: parsed.id_bytes, invite_id: parsed.id, master_secret: parsed.master_secret };
159
+ }
160
+ /** The room-kind sibling of {@link parseHandoffKey}/{@link parseInviteKey} (add-room-invite design D3). */
161
+ export function parseRoomInviteKey(raw) {
162
+ const parsed = parseClaimKey(raw, "room");
163
+ return { kind: "room", invite_id_bytes: parsed.id_bytes, invite_id: parsed.id, master_secret: parsed.master_secret };
164
+ }
165
+ /** `HKDF-SHA256(ikm=master_secret, salt=id[16], info=…)` per D3, domain-separated by kind, for both `auth_secret` and `wrap_key`. Vault kinds only — `room` has no `wrap_key` and derives separately below. */
166
+ function deriveClaimSecrets(kind, idBytes, masterSecret) {
167
+ const authInfo = `kygit/${kind}/auth/v1`;
168
+ const wrapInfo = `kygit/${kind}/wrap/v1`;
169
+ const authHashLabel = `kygit/${kind}/auth-hash/v1`;
170
+ const authSecret = hkdf(sha256, masterSecret, idBytes, utf8ToBytes(authInfo), 32);
171
+ const wrapKey = hkdf(sha256, masterSecret, idBytes, utf8ToBytes(wrapInfo), 32);
172
+ const authHash = sha256(concatBytes(utf8ToBytes(authHashLabel), authSecret));
173
+ // ONE SHA-256 over (label ‖ auth_secret), hex-encoded — exactly what the
174
+ // gateway recomputes at claim (`computeAuthHash`). Through 4.68.1 this line
175
+ // ran the digest through `sha256Hex` (which hashes its input again), so the
176
+ // stored value was sha256(sha256(label ‖ secret)) and NO key minted by any
177
+ // published client could ever verify. The cross-side vector in
178
+ // gitvault-handoff.test.ts now recomputes the gateway's hash independently.
179
+ return { auth_secret: authSecret, wrap_key: wrapKey, auth_hash_hex: bytesToHex(authHash) };
180
+ }
181
+ /** `HKDF-SHA256(ikm=master_secret, salt=handoff_id[16], info=kygit/handoff/…)` per D3, for both `auth_secret` and `wrap_key`. */
182
+ export function deriveHandoffSecrets(handoffIdBytes, masterSecret) {
183
+ return deriveClaimSecrets("handoff", handoffIdBytes, masterSecret);
184
+ }
185
+ /** The invite-kind sibling of {@link deriveHandoffSecrets}, domain-separated under `kygit/invite/…` info strings (kygit-invite design D3) — an invite secret never verifies as a handoff hash, or the reverse. */
186
+ export function deriveInviteSecrets(inviteIdBytes, masterSecret) {
187
+ return deriveClaimSecrets("invite", inviteIdBytes, masterSecret);
188
+ }
189
+ // ─── HKDF derivation — room kind (add-room-invite design D3) ────────────────
190
+ //
191
+ // A room invite derives EXACTLY ONE secret — no `wrap_key`, no envelope, no
192
+ // admission seed exist for this kind (there is nothing sealed: the gateway
193
+ // already reads every room message in plaintext, so there is no secret to
194
+ // hide from it). The info string and hash label are their OWN
195
+ // `run402/room-invite/…` namespace, never `kygit/room/…` — domain-separated
196
+ // from every vault kind so a room secret never verifies as a handoff/invite
197
+ // hash and neither of those ever verifies as a room hash, even for a row
198
+ // whose id every parser recovers.
199
+ const ROOM_INVITE_AUTH_INFO = "run402/room-invite/auth/v1";
200
+ const ROOM_INVITE_AUTH_HASH_LABEL = "run402/room-invite/auth-hash/v1";
201
+ /** `HKDF-SHA256(ikm=master_secret, salt=invite_id[16], info="run402/room-invite/auth/v1")` — the ONE secret a room invite derives (design D3). */
202
+ export function deriveRoomInviteAuthSecret(inviteIdBytes, masterSecret) {
203
+ return hkdf(sha256, masterSecret, inviteIdBytes, utf8ToBytes(ROOM_INVITE_AUTH_INFO), 32);
204
+ }
205
+ /** `SHA-256("run402/room-invite/auth-hash/v1" ‖ auth_secret)`, lowercase hex — exactly what the gateway's `mintRoomInvite`/`claimRoomInvite` compute and store/compare (design D3). */
206
+ export function computeRoomInviteAuthHash(authSecret) {
207
+ return bytesToHex(sha256(concatBytes(utf8ToBytes(ROOM_INVITE_AUTH_HASH_LABEL), authSecret)));
208
+ }
209
+ //# sourceMappingURL=bearer-claim-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bearer-claim-key.js","sourceRoot":"","sources":["../../src/node/bearer-claim-key.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,25 @@ export declare function pinGitvaultRepo(repoDir: string, repoId: string, resolve
65
65
  org_id: string;
66
66
  room_key?: string;
67
67
  }): Promise<void>;
68
+ /**
69
+ * add-room-invite design D10: a bare `rooms join <key>` arrival standing
70
+ * inside a git repository pins `r402.orgId`/`r402.room` in this checkout's
71
+ * LOCAL git config — the SAME two keys {@link pinGitvaultRepo} writes
72
+ * alongside a vault's `r402.repoId` — but WITHOUT one, since a room-only
73
+ * join has no vault to pin. Read back by {@link readPinnedRoomBinding},
74
+ * independent of {@link readPinnedGitvaultRepo}'s own gate on `r402.repoId`
75
+ * being present (a room-only checkout never sets it, so that reader would
76
+ * otherwise see this pin as absent).
77
+ */
78
+ export declare function pinRoomBinding(repoDir: string, ids: {
79
+ org_id: string;
80
+ room_key: string;
81
+ }): Promise<void>;
82
+ /** Read `r402.orgId`/`r402.room` directly, with NO gate on `r402.repoId` (design D10) — the counterpart read for {@link pinRoomBinding}. Either field is `null` when unset (no repository, or never pinned). */
83
+ export declare function readPinnedRoomBinding(repoDir: string): Promise<{
84
+ org_id: string | null;
85
+ room: string | null;
86
+ }>;
68
87
  export interface GitvaultAddressResolution {
69
88
  repo_id: string;
70
89
  project_id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"gitvault-address.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-address.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitvault-address.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-address.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAA6B,KAAK,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClG,OAAO,KAAK,EAAuB,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAExF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAuB/D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,aAAa,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,2JAA2J;IAC3J,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uJAAuJ;IACvJ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAcD,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAUhG;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAY7M;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9G;AAED,gNAAgN;AAChN,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAIpH;AAmBD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,GAAG,EAAE,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACjD,iFAAiF;IACjF,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,iGAAiG;IACjG,OAAO,EAAE;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,gBAAgB,EAAE,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChI;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,6GAA6G;IAC7G,OAAO,EAAE,qBAAqB,CAAC;IAC/B,8JAA8J;IAC9J,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0KAA0K;IAC1K,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACzC,wGAAwG;IACxG,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG;;;;;;;;;OASG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAoGvH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,EAAE,yBAAyB,CAAC;IACtC,0BAA0B;IAC1B,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAY5C"}
@@ -99,6 +99,26 @@ export async function pinGitvaultRepo(repoDir, repoId, resolvedFrom, ids) {
99
99
  await hardenedGit(repoDir, ["config", "--local", CONFIG_KEY_ROOM, ids.room_key ?? ids.project_id]);
100
100
  }
101
101
  }
102
+ /**
103
+ * add-room-invite design D10: a bare `rooms join <key>` arrival standing
104
+ * inside a git repository pins `r402.orgId`/`r402.room` in this checkout's
105
+ * LOCAL git config — the SAME two keys {@link pinGitvaultRepo} writes
106
+ * alongside a vault's `r402.repoId` — but WITHOUT one, since a room-only
107
+ * join has no vault to pin. Read back by {@link readPinnedRoomBinding},
108
+ * independent of {@link readPinnedGitvaultRepo}'s own gate on `r402.repoId`
109
+ * being present (a room-only checkout never sets it, so that reader would
110
+ * otherwise see this pin as absent).
111
+ */
112
+ export async function pinRoomBinding(repoDir, ids) {
113
+ await hardenedGit(repoDir, ["config", "--local", CONFIG_KEY_ORG_ID, ids.org_id]);
114
+ await hardenedGit(repoDir, ["config", "--local", CONFIG_KEY_ROOM, ids.room_key]);
115
+ }
116
+ /** Read `r402.orgId`/`r402.room` directly, with NO gate on `r402.repoId` (design D10) — the counterpart read for {@link pinRoomBinding}. Either field is `null` when unset (no repository, or never pinned). */
117
+ export async function readPinnedRoomBinding(repoDir) {
118
+ const org_id = await readLocalGitConfig(repoDir, CONFIG_KEY_ORG_ID);
119
+ const room = await readLocalGitConfig(repoDir, CONFIG_KEY_ROOM);
120
+ return { org_id, room };
121
+ }
102
122
  /** Clear a pin this checkout no longer trusts (design D4: a pinned id that 404s). Tolerates an absent key — `git config --unset` on a key that was never set is not a failure here. */
103
123
  async function clearPinnedGitvaultRepo(repoDir) {
104
124
  for (const key of [CONFIG_KEY_REPO_ID, CONFIG_KEY_ADDRESS, CONFIG_KEY_PROJECT_ID, CONFIG_KEY_ORG_ID, CONFIG_KEY_ROOM]) {
@@ -1 +1 @@
1
- {"version":3,"file":"gitvault-address.js","sourceRoot":"","sources":["../../src/node/gitvault-address.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitvault-address.js","sourceRoot":"","sources":["../../src/node/gitvault-address.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAA8B,MAAM,2BAA2B,CAAC;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAIpE,MAAM,kBAAkB,GAAG,aAAa,CAAC;AACzC,4GAA4G;AAC5G,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAC9C;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAC/C,MAAM,iBAAiB,GAAG,YAAY,CAAC;AACvC;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,WAAW,CAAC;AAcpC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,GAAW;IAC5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5F,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,wEAAwE;QACxE,4DAA4D;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAe;IAC1D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrI,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAChE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACtG,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,MAAc,EAAE,YAAsD,EAAE,GAA+D;IAC5L,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,IAAI,YAAY;QAAE,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9I,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACzF,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,kDAAkD;QAClD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,GAAyC;IAC7F,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,gNAAgN;AAChN,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,uLAAuL;AACvL,KAAK,UAAU,uBAAuB,CAAC,OAAe;IACpD,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,eAAe,CAAC,EAAE,CAAC;QACtH,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,SAAS,UAAU,CAAC,CAAU;IAC5B,MAAM,GAAG,GAAG,CAA8C,CAAC;IAC3D,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC;AACrH,CAAC;AAwDD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAsC;IACjF,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,CAAC;YACX,sEAAsE;YACtE,uEAAuE;YACvE,mEAAmE;YACnE,8BAA8B;YAC9B,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACvC,kEAAkE;gBAClE,kEAAkE;gBAClE,oEAAoE;gBACpE,gEAAgE;gBAChE,+DAA+D;gBAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACtN,CAAC;YACD,IAAI,CAAC;gBACH,qEAAqE;gBACrE,kEAAkE;gBAClE,qCAAqC;gBACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnF,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,IAAI,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrJ,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACvN,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;oBAAE,MAAM,CAAC,CAAC;gBAC5B,MAAM,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAChD,6DAA6D;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAClC,mEAAmE;YACnE,sEAAsE;YACtE,qEAAqE;YACrE,8DAA8D;YAC9D,gEAAgE;YAChE,mEAAmE;YACnE,qEAAqE;YACrE,kEAAkE;YAClE,0CAA0C;YAC1C,oEAAoE;YACpE,qEAAqE;YACrE,+DAA+D;YAC/D,4DAA4D;YAC5D,oDAAoD;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7G,IAAI,aAAa,EAAE,CAAC;gBAClB,oEAAoE;gBACpE,+DAA+D;gBAC/D,gEAAgE;gBAChE,8DAA8D;gBAC9D,kEAAkE;gBAClE,+DAA+D;gBAC/D,mEAAmE;gBACnE,6CAA6C;gBAC7C,IAAI,OAAO,CAAC,QAAQ;oBAAE,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxK,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1L,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAwB,MAAM,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3H,sEAAsE;QACtE,mEAAmE;QACnE,wEAAwE;QACxE,sEAAsE;QACtE,uEAAuE;QACvE,mCAAmC;QACnC,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACnJ,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACtK,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IAE5C,qEAAqE;IACrE,yEAAyE;IACzE,sEAAsE;IACtE,sDAAsD;IACtD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,QAAQ;YACnB,GAAG,CAAC,OAAO,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvG,GAAG,CAAC,OAAO,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxG,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ;YAAE,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACpL,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnP,CAAC;IAED,yEAAyE;IACzE,gEAAgE;IAChE,mDAAmD;IACnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnG,IAAI,OAAO,CAAC,QAAQ;QAAE,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACpL,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC9M,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAS7C;IACC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAkD,CAAC;IACvE,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,wBAAwB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC;IAC3H,IAAI,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3L,OAAO,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,98 +1,7 @@
1
1
  import { GITVAULT_FORMAT, GITVAULT_SUITE } from "../namespaces/gitvault.crypto.js";
2
- export type ClaimKind = "handoff" | "invite";
3
- export interface HandoffKeyPrefixEntry {
4
- prefix: string;
5
- kind: ClaimKind;
6
- verb: string;
7
- /** Error-code prefix for this kind (`HANDOFF` | `INVITE`) — every client-side code this module throws is `${errorPrefix}_…`. */
8
- errorPrefix: string;
9
- /**
10
- * The sealed-envelope `envelope_kind` tag this kind's mint seals TODAY —
11
- * the v2 shape for both kinds (`v: 2`, `writer_admission_grant_sha256`,
12
- * `epoch_keys`), since writer admission rides the envelope for every claim
13
- * kind (gitvault-multi-writer D4). `kygit-handoff-envelope-v1` survives
14
- * only as a legacy OPENER constant ({@link HANDOFF_ENVELOPE_KIND}); no
15
- * invite v1 ever existed.
16
- */
17
- envelopeKind: string;
18
- /** This kind's note schema tag. */
19
- noteSchema: string;
20
- /** This kind's envelope frame magic (4 ASCII bytes). */
21
- frameMagic: string;
22
- }
23
- /**
24
- * `kgh1_` is the first row (handoff); `kgi1_` is the second (invite,
25
- * kygit-invite design D3). A future third kind is a SIBLING row here, never
26
- * a branch on either existing one's parser.
27
- */
28
- export declare const HANDOFF_KEY_PREFIXES: readonly HandoffKeyPrefixEntry[];
29
- export interface ClaimKeyParts {
30
- kind: ClaimKind;
31
- id_bytes: Uint8Array;
32
- /** Canonical lowercase-hyphenated UUID form of `id_bytes` — the wire id (`handoff_id`/`invite_id`). */
33
- id: string;
34
- master_secret: Uint8Array;
35
- }
36
- /** {@link parseHandoffKey}'s legacy field names, preserved byte-identical. */
37
- export interface HandoffKeyParts {
38
- kind: "handoff";
39
- handoff_id_bytes: Uint8Array;
40
- handoff_id: string;
41
- master_secret: Uint8Array;
42
- }
43
- /** {@link parseInviteKey}'s field names — the invite-kind sibling of {@link HandoffKeyParts}. */
44
- export interface InviteKeyParts {
45
- kind: "invite";
46
- invite_id_bytes: Uint8Array;
47
- invite_id: string;
48
- master_secret: Uint8Array;
49
- }
50
- export declare function uuidToBytes(uuid: string, field?: string): Uint8Array;
51
- /**
52
- * Assemble the printed key from a fresh 32-byte master secret and the
53
- * gateway-minted `handoff_id`. The gateway never sees `master_secret` — the
54
- * caller derives `auth_hash` (via {@link deriveHandoffSecrets}) and sends
55
- * ONLY that.
56
- */
57
- export declare function assembleHandoffKey(handoffId: string, masterSecret?: Uint8Array): {
58
- key: string;
59
- handoff_id_bytes: Uint8Array;
60
- master_secret: Uint8Array;
61
- };
62
- /** The invite-kind sibling of {@link assembleHandoffKey} (kygit-invite design D3). */
63
- export declare function assembleInviteKey(inviteId: string, masterSecret?: Uint8Array): {
64
- key: string;
65
- invite_id_bytes: Uint8Array;
66
- master_secret: Uint8Array;
67
- };
68
- /**
69
- * Parse ANY `kg**_` claim-family key by its prefix registry against the
70
- * `expectedKind` the calling verb accepts. A recognized prefix of a
71
- * DIFFERENT kind (a `kgi1_` invite key handed to `resume`, or a `kgh1_`
72
- * handoff key handed to `join`) refuses BY NAME pointing at its own verb —
73
- * never misread as a malformed key of the expected kind, and never
74
- * contacting the gateway (design D9 rule 4 / kygit-invite design D3).
75
- */
76
- export declare function parseClaimKey(raw: string, expectedKind: ClaimKind): ClaimKeyParts;
77
- /**
78
- * Parse ANY `kg**_` handoff-family key by its prefix registry. A recognized
79
- * prefix of a DIFFERENT kind (an invite key handed to `resume`) refuses BY
80
- * NAME pointing at its own verb — never misread as a malformed handoff key
81
- * (design D9 rule 4). Kind-bound alias of {@link parseClaimKey}.
82
- */
83
- export declare function parseHandoffKey(raw: string): HandoffKeyParts;
84
- /** The invite-kind sibling of {@link parseHandoffKey} (kygit-invite design D3). */
85
- export declare function parseInviteKey(raw: string): InviteKeyParts;
86
- export interface HandoffSecrets {
87
- auth_secret: Uint8Array;
88
- wrap_key: Uint8Array;
89
- /** `SHA-256(auth-hash-label ‖ auth_secret)`, lowercase hex — the ONLY thing the gateway ever stores. */
90
- auth_hash_hex: string;
91
- }
92
- /** `HKDF-SHA256(ikm=master_secret, salt=handoff_id[16], info=kygit/handoff/…)` per D3, for both `auth_secret` and `wrap_key`. */
93
- export declare function deriveHandoffSecrets(handoffIdBytes: Uint8Array, masterSecret: Uint8Array): HandoffSecrets;
94
- /** The invite-kind sibling of {@link deriveHandoffSecrets}, domain-separated under `kygit/invite/…` info strings (kygit-invite design D3) — an invite secret never verifies as a handoff hash, or the reverse. */
95
- export declare function deriveInviteSecrets(inviteIdBytes: Uint8Array, masterSecret: Uint8Array): HandoffSecrets;
2
+ import { type ClaimKind, type HandoffKeyPrefixEntry, type ClaimKeyParts, type HandoffKeyParts, type InviteKeyParts, type HandoffSecrets, HANDOFF_KEY_PREFIXES, uuidToBytes, assembleHandoffKey, assembleInviteKey, parseClaimKey, parseHandoffKey, parseInviteKey, deriveHandoffSecrets, deriveInviteSecrets } from "./bearer-claim-key.js";
3
+ export { HANDOFF_KEY_PREFIXES, uuidToBytes, assembleHandoffKey, assembleInviteKey, parseClaimKey, parseHandoffKey, parseInviteKey, deriveHandoffSecrets, deriveInviteSecrets, };
4
+ export type { ClaimKind, HandoffKeyPrefixEntry, ClaimKeyParts, HandoffKeyParts, InviteKeyParts, HandoffSecrets };
96
5
  /**
97
6
  * Third HKDF output of a claim key's `master_secret` (design D4, protocol
98
7
  * §4.17; kind-parameterized by kygit-invite design D3): the one-use
@@ -332,5 +241,4 @@ export declare function scanInviteNoteForSecrets(note: KygitInviteNote): Handoff
332
241
  export declare function assertHandoffNoteHasNoSecret(note: KygitHandoffNote): void;
333
242
  /** Throws `INVITE_NOTE_CONTAINS_SECRET` naming the field — call before the invite commit is written (kygit-invite design D3). */
334
243
  export declare function assertInviteNoteHasNoSecret(note: KygitInviteNote): void;
335
- export {};
336
244
  //# sourceMappingURL=gitvault-handoff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitvault-handoff.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitvault-handoff.d.ts","sourceRoot":"","sources":["../../src/node/gitvault-handoff.ts"],"names":[],"mappings":"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"}
@@ -40,133 +40,20 @@ import { concatBytes, utf8ToBytes } from "@noble/hashes/utils.js";
40
40
  import { xchacha20poly1305 } from "@noble/ciphers/chacha.js";
41
41
  import { base64 } from "@scure/base";
42
42
  import { LocalError } from "../errors.js";
43
- import { _gitvaultAeadBackend, fromBase64url, randomBytes, toBase64url, bytesToHex, GITVAULT_FORMAT, GITVAULT_SUITE, GITVAULT_HEX16_RE, GITVAULT_SHA256_RE, signaturePreimage, ed25519Sign, ed25519PublicKey, ed25519VerifyStrict, vkFingerprint, ekFingerprint, } from "../namespaces/gitvault.crypto.js";
43
+ import { _gitvaultAeadBackend, fromBase64url, randomBytes, toBase64url, GITVAULT_FORMAT, GITVAULT_SUITE, GITVAULT_HEX16_RE, GITVAULT_SHA256_RE, signaturePreimage, ed25519Sign, ed25519PublicKey, ed25519VerifyStrict, vkFingerprint, ekFingerprint, } from "../namespaces/gitvault.crypto.js";
44
+ // add-room-invite design D2: the pure key-format primitives (the registry,
45
+ // uuidToBytes, assemble/parse, the HKDF derive) moved to
46
+ // `bearer-claim-key.ts` — a move, not a copy — so the room kind (`kri1_`)
47
+ // can share them without teaching THIS vault-shaped module a room-shaped
48
+ // kind. Every symbol this module previously exported is re-exported here
49
+ // under its existing name, so nothing importing it changes.
50
+ import { HANDOFF_KEY_PREFIXES, uuidToBytes, assembleHandoffKey, assembleInviteKey, parseClaimKey, parseHandoffKey, parseInviteKey, deriveHandoffSecrets, deriveInviteSecrets, } from "./bearer-claim-key.js";
51
+ export { HANDOFF_KEY_PREFIXES, uuidToBytes, assembleHandoffKey, assembleInviteKey, parseClaimKey, parseHandoffKey, parseInviteKey, deriveHandoffSecrets, deriveInviteSecrets, };
44
52
  function fail(code, message, context, details) {
45
53
  throw new LocalError(message, context, { code, details });
46
54
  }
47
- /**
48
- * `kgh1_` is the first row (handoff); `kgi1_` is the second (invite,
49
- * kygit-invite design D3). A future third kind is a SIBLING row here, never
50
- * a branch on either existing one's parser.
51
- */
52
- export const HANDOFF_KEY_PREFIXES = [
53
- { prefix: "kgh1_", kind: "handoff", verb: "resume", errorPrefix: "HANDOFF", envelopeKind: "kygit-handoff-envelope-v2", noteSchema: "kygit.handoff-note.v1", frameMagic: "KGH1" },
54
- { prefix: "kgi1_", kind: "invite", verb: "join", errorPrefix: "INVITE", envelopeKind: "kygit-invite-envelope-v2", noteSchema: "kygit.invite-note.v1", frameMagic: "KGI1" },
55
- ];
56
55
  const HANDOFF_ENTRY = HANDOFF_KEY_PREFIXES[0];
57
56
  const INVITE_ENTRY = HANDOFF_KEY_PREFIXES[1];
58
- const CLAIM_ID_BYTES = 16;
59
- const MASTER_SECRET_BYTES = 32;
60
- const CLAIM_KEY_BODY_BYTES = CLAIM_ID_BYTES + MASTER_SECRET_BYTES;
61
- function bytesToUuid(bytes) {
62
- const h = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
63
- return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
64
- }
65
- const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
66
- export function uuidToBytes(uuid, field = "handoff_id") {
67
- if (!UUID_RE.test(uuid))
68
- fail("HANDOFF_ID_INVALID", `${field} is not a canonical UUID`, "parsing handoff id", { field });
69
- const hex = uuid.replace(/-/g, "").toLowerCase();
70
- const out = new Uint8Array(16);
71
- for (let i = 0; i < 16; i++)
72
- out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
73
- return out;
74
- }
75
- /** Assemble a printed claim key from a fresh 32-byte master secret and the gateway-minted claim id, for `entry`'s kind. */
76
- function assembleClaimKey(entry, claimId, masterSecret) {
77
- if (masterSecret.length !== MASTER_SECRET_BYTES)
78
- fail(`${entry.errorPrefix}_KEY_INVALID`, "master_secret must be 32 bytes", `assembling ${entry.kind} key`);
79
- const idBytes = uuidToBytes(claimId, `${entry.kind}_id`);
80
- const body = concatBytes(idBytes, masterSecret);
81
- return { key: `${entry.prefix}${toBase64url(body)}`, id_bytes: idBytes, master_secret: masterSecret };
82
- }
83
- /**
84
- * Assemble the printed key from a fresh 32-byte master secret and the
85
- * gateway-minted `handoff_id`. The gateway never sees `master_secret` — the
86
- * caller derives `auth_hash` (via {@link deriveHandoffSecrets}) and sends
87
- * ONLY that.
88
- */
89
- export function assembleHandoffKey(handoffId, masterSecret = randomBytes(MASTER_SECRET_BYTES)) {
90
- const { key, id_bytes, master_secret } = assembleClaimKey(HANDOFF_ENTRY, handoffId, masterSecret);
91
- return { key, handoff_id_bytes: id_bytes, master_secret };
92
- }
93
- /** The invite-kind sibling of {@link assembleHandoffKey} (kygit-invite design D3). */
94
- export function assembleInviteKey(inviteId, masterSecret = randomBytes(MASTER_SECRET_BYTES)) {
95
- const { key, id_bytes, master_secret } = assembleClaimKey(INVITE_ENTRY, inviteId, masterSecret);
96
- return { key, invite_id_bytes: id_bytes, master_secret };
97
- }
98
- /**
99
- * Parse ANY `kg**_` claim-family key by its prefix registry against the
100
- * `expectedKind` the calling verb accepts. A recognized prefix of a
101
- * DIFFERENT kind (a `kgi1_` invite key handed to `resume`, or a `kgh1_`
102
- * handoff key handed to `join`) refuses BY NAME pointing at its own verb —
103
- * never misread as a malformed key of the expected kind, and never
104
- * contacting the gateway (design D9 rule 4 / kygit-invite design D3).
105
- */
106
- export function parseClaimKey(raw, expectedKind) {
107
- const expectedEntry = expectedKind === "handoff" ? HANDOFF_ENTRY : INVITE_ENTRY;
108
- const trimmed = raw.trim();
109
- const entry = HANDOFF_KEY_PREFIXES.find((e) => trimmed.startsWith(e.prefix));
110
- if (!entry) {
111
- fail(`${expectedEntry.errorPrefix}_KEY_INVALID`, `not a recognized kygit key (expected a key starting ${expectedEntry.prefix})`, "parsing claim key");
112
- }
113
- if (entry.kind !== expectedKind) {
114
- fail(`${expectedEntry.errorPrefix}_KEY_WRONG_KIND`, `this key is a ${entry.kind} key — use \`kygit ${entry.verb}\` instead of ${expectedEntry.verb}`, "parsing claim key", { kind: entry.kind, verb: entry.verb });
115
- }
116
- const body = trimmed.slice(entry.prefix.length);
117
- let bytes;
118
- try {
119
- bytes = fromBase64url(body, `${entry.kind} key body`);
120
- }
121
- catch {
122
- fail(`${entry.errorPrefix}_KEY_INVALID`, "the key body is not valid base64url", "parsing claim key");
123
- }
124
- if (bytes.length !== CLAIM_KEY_BODY_BYTES) {
125
- fail(`${entry.errorPrefix}_KEY_INVALID`, `the key decodes to ${bytes.length} bytes; expected ${CLAIM_KEY_BODY_BYTES}`, "parsing claim key");
126
- }
127
- const idBytes = bytes.subarray(0, CLAIM_ID_BYTES);
128
- const masterSecret = bytes.subarray(CLAIM_ID_BYTES);
129
- return { kind: entry.kind, id_bytes: idBytes, id: bytesToUuid(idBytes), master_secret: masterSecret };
130
- }
131
- /**
132
- * Parse ANY `kg**_` handoff-family key by its prefix registry. A recognized
133
- * prefix of a DIFFERENT kind (an invite key handed to `resume`) refuses BY
134
- * NAME pointing at its own verb — never misread as a malformed handoff key
135
- * (design D9 rule 4). Kind-bound alias of {@link parseClaimKey}.
136
- */
137
- export function parseHandoffKey(raw) {
138
- const parsed = parseClaimKey(raw, "handoff");
139
- return { kind: "handoff", handoff_id_bytes: parsed.id_bytes, handoff_id: parsed.id, master_secret: parsed.master_secret };
140
- }
141
- /** The invite-kind sibling of {@link parseHandoffKey} (kygit-invite design D3). */
142
- export function parseInviteKey(raw) {
143
- const parsed = parseClaimKey(raw, "invite");
144
- return { kind: "invite", invite_id_bytes: parsed.id_bytes, invite_id: parsed.id, master_secret: parsed.master_secret };
145
- }
146
- /** `HKDF-SHA256(ikm=master_secret, salt=id[16], info=…)` per D3, domain-separated by kind, for both `auth_secret` and `wrap_key`. */
147
- function deriveClaimSecrets(kind, idBytes, masterSecret) {
148
- const authInfo = `kygit/${kind}/auth/v1`;
149
- const wrapInfo = `kygit/${kind}/wrap/v1`;
150
- const authHashLabel = `kygit/${kind}/auth-hash/v1`;
151
- const authSecret = hkdf(sha256, masterSecret, idBytes, utf8ToBytes(authInfo), 32);
152
- const wrapKey = hkdf(sha256, masterSecret, idBytes, utf8ToBytes(wrapInfo), 32);
153
- const authHash = sha256(concatBytes(utf8ToBytes(authHashLabel), authSecret));
154
- // ONE SHA-256 over (label ‖ auth_secret), hex-encoded — exactly what the
155
- // gateway recomputes at claim (`computeAuthHash`). Through 4.68.1 this line
156
- // ran the digest through `sha256Hex` (which hashes its input again), so the
157
- // stored value was sha256(sha256(label ‖ secret)) and NO key minted by any
158
- // published client could ever verify. The cross-side vector in
159
- // gitvault-handoff.test.ts now recomputes the gateway's hash independently.
160
- return { auth_secret: authSecret, wrap_key: wrapKey, auth_hash_hex: bytesToHex(authHash) };
161
- }
162
- /** `HKDF-SHA256(ikm=master_secret, salt=handoff_id[16], info=kygit/handoff/…)` per D3, for both `auth_secret` and `wrap_key`. */
163
- export function deriveHandoffSecrets(handoffIdBytes, masterSecret) {
164
- return deriveClaimSecrets("handoff", handoffIdBytes, masterSecret);
165
- }
166
- /** The invite-kind sibling of {@link deriveHandoffSecrets}, domain-separated under `kygit/invite/…` info strings (kygit-invite design D3) — an invite secret never verifies as a handoff hash, or the reverse. */
167
- export function deriveInviteSecrets(inviteIdBytes, masterSecret) {
168
- return deriveClaimSecrets("invite", inviteIdBytes, masterSecret);
169
- }
170
57
  // ─── Writer-admission grant + acceptance (gitvault-multi-writer D4/§4.17) ───
171
58
  //
172
59
  // The bearer-completable path for `add_writer_key{authorization.kind: