@real-life/trust-protocol 0.3.1 → 0.3.2
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.
- package/dist/probe/introduce.d.ts +1 -9
- package/dist/probe/introduce.d.ts.map +1 -1
- package/dist/probe/introduce.js +11 -0
- package/dist/probe/introduce.js.map +1 -1
- package/dist/probe/membership.d.ts +6 -0
- package/dist/probe/membership.d.ts.map +1 -1
- package/dist/probe/membership.js +18 -1
- package/dist/probe/membership.js.map +1 -1
- package/package.json +3 -2
|
@@ -44,15 +44,7 @@ export declare function receiveOffer(p: Person, env: any): Promise<{
|
|
|
44
44
|
error: string;
|
|
45
45
|
duplicate?: undefined;
|
|
46
46
|
}>;
|
|
47
|
-
export declare function consent(p: Person, entry: any, drop: any, when: number, ent?: any): Promise<
|
|
48
|
-
queued: boolean;
|
|
49
|
-
ctx?: undefined;
|
|
50
|
-
mutual?: undefined;
|
|
51
|
-
} | {
|
|
52
|
-
ctx: C.Context;
|
|
53
|
-
mutual: boolean;
|
|
54
|
-
queued?: undefined;
|
|
55
|
-
}>;
|
|
47
|
+
export declare function consent(p: Person, entry: any, drop: any, when: number, ent?: any): Promise<any>;
|
|
56
48
|
export declare function checkDrop(p: Person, entry: any, drop: any): Promise<{
|
|
57
49
|
mutual: boolean;
|
|
58
50
|
error?: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"introduce.d.ts","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAOvC,wBAAgB,YAAY,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAexE;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,sBAI5D;AAMD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAG3D;AACD,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;;;;GAc3F;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;GAGhF;AAGD,wBAAgB,UAAU;;SAGX,GAAG,EAAE;eACJ,MAAM,QAAQ,MAAM,MAAM,MAAM;eAChC,MAAM,MAAM,MAAM;EAEjC;AAwBD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;GAwBxG;AAGD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG;;;;;;;;;;;;;;GAOtD;AA8BD,wBAAsB,OAAO,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ
|
|
1
|
+
{"version":3,"file":"introduce.d.ts","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAOvC,wBAAgB,YAAY,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAexE;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,sBAI5D;AAMD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAG3D;AACD,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM;;;;GAc3F;AAED,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;GAGhF;AAGD,wBAAgB,UAAU;;SAGX,GAAG,EAAE;eACJ,MAAM,QAAQ,MAAM,MAAM,MAAM;eAChC,MAAM,MAAM,MAAM;EAEjC;AAwBD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;GAwBxG;AAGD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG;;;;;;;;;;;;;;GAOtD;AA8BD,wBAAsB,OAAO,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAS3F;AA0BD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;;;;;;;;;;;;UAkChE;AAGD,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,iBAQrE"}
|
package/dist/probe/introduce.js
CHANGED
|
@@ -195,11 +195,22 @@ async function receiveOfferInner(p, env, offer) {
|
|
|
195
195
|
// controls the own card; the counterpart's card arrives via sync
|
|
196
196
|
// (checkDrop) whether or not this side ever consents.
|
|
197
197
|
export async function consent(p, entry, drop, when, ent = {}) {
|
|
198
|
+
// the release happens once: a repeated consent keeps the released context
|
|
199
|
+
// and card (a new pair would orphan the channel the counterpart holds);
|
|
200
|
+
// a call while the release is in flight shares it (single-flight, #8)
|
|
201
|
+
if (entry.released)
|
|
202
|
+
return { ctx: entry.ownCtx, mutual: !!entry.counterpartAnchor };
|
|
203
|
+
if (entry.releasing)
|
|
204
|
+
return entry.releasing;
|
|
198
205
|
if (!p.online) {
|
|
199
206
|
p.queue.push(() => consent(p, entry, drop, when, ent));
|
|
200
207
|
say(p, 'offline — Freigabe wartet auf Netz');
|
|
201
208
|
return { queued: true };
|
|
202
209
|
}
|
|
210
|
+
entry.releasing = release(p, entry, drop, when, ent).finally(() => { entry.releasing = null; });
|
|
211
|
+
return entry.releasing;
|
|
212
|
+
}
|
|
213
|
+
async function release(p, entry, drop, when, ent) {
|
|
203
214
|
const { offer } = entry;
|
|
204
215
|
const secret = C.fromB64u(offer.rendezvous);
|
|
205
216
|
const myDir = offer.direction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"introduce.js","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"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","sourcesContent":["// introduce.mjs — the introduction act, PROBE for the §8 recast.\n// DOM-free, deterministic-capable, on rltp-core + rltp-crypto.\n//\n// THE MODEL (Anton's cuts, 25.08. — supersedes converged §8@1's\n// requester-initiated ferry):\n// 1. MEDIATOR-INITIATED: only M can point at both parties (a requester\n// has no in-app handle for the target; the verbal wish lives in real\n// life). M opens a contact, taps \"Vorstellen…\", picks the other.\n// 2. INDEPENDENT RELEASE (ceremony-parallel): both sides receive the\n// offer simultaneously; EACH consent releases that person's OWN\n// fresh card — one-sided outcomes stay first-class (◇), mutuality\n// arises when both have released (⇄).\n// 3. RENDEZVOUS DROP, not ferry: the offers carry a per-act secret;\n// consenting devices deposit their sealed card at a derived topic\n// and fetch the counterpart's — THE MEDIATOR IS NEVER NEEDED AGAIN\n// after the initiating act (airplane-mode scenario). The drop is a\n// PORT (put/get by derived topic, opaque blobs, TTL); relay-topic /\n// DHT / iroh node / M's device are adapters below it.\n// 4. The mediator VOUCHER binds the ACT, not the card (the drop model\n// makes card-digest vouchers impossible — M never sees the cards;\n// harvest finding for the recast). Each offer carries the voucher\n// FOR THE COUNTERPART, signed under M's channel anchor toward that\n// counterpart; the consenting side deposits it beside its card, so\n// the fetcher verifies \"this introduction came from MY M\".\n// Trust: M remains the authenticity anchor of the introduction either\n// way; the systemic control is the first real encounter (◇→✓,\n// continuity). Deniability/linkability hardening is RECAST WORK — this\n// probe signs plainly and says so.\nimport { jcs, makeValidator, tsec } from '../core.js'\nimport { SCHEMAS } from '../schemas.js'\nconst VAL = makeValidator(SCHEMAS)\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { snapshotPriors } from './continuity.js'\n\nconst te = new TextEncoder(), td = new TextDecoder()\nconst S = globalThis.crypto.subtle\n\n// ── people ──────────────────────────────────────────────────────────────\nexport function createPerson (name: string, rootIkm?: Uint8Array): Person {\n return {\n name,\n rootIkm: rootIkm ?? C.rand(64),\n contexts: new Map(), // anchor/keyAgreement -> pair ctx (fresh-always)\n contacts: new Map(), // counterpart anchor -> { name, card, provenance, state, channel }\n inbox: [], // received offers/invites awaiting the human\n groups: new Map(), // genesisDigest -> group state (Stage C, groups.mjs)\n online: true,\n queue: [], // actions deferred while offline (device ferry of ONESELF)\n log: [],\n // the demo community's genesis — a PROBE FIXTURE the person carries,\n // so the strict identity layer never needs a default\n communityGenesis: C.COMMUNITY_GENESIS,\n }\n}\nconst say = (p: Person, m: string) => p.log.push(m)\nexport async function freshCtx (p: Person, nonce?: Uint8Array) {\n const ctx = await C.pairContext(p.rootIkm, nonce ?? C.rand(32))\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\n\n// ── die Zeremonie in SCHRITTEN — die App-Choreografie (Encounter 5.2):\n// Code zeigen → scannen → BEIDE bestätigen bewusst; erst dann entsteht\n// das Enactment. Der gezeigte Anker ist immer frisch (4.4) und verrät\n// nichts — wer ihn wirklich trifft, klärt hinterher die §6a-Probe.\nexport async function ceremonyShow (p: Person, ent: any = {}) {\n const ctx = await freshCtx(p, ent.nonce)\n return { ctx, ch: C.challengeOf(ent.ch ?? C.rand(17)) }\n}\nexport async function ceremonyComplete (a: Person, sa: any, b: Person, sb: any, when: number) {\n const ctxA = sa.ctx, ctxB = sb.ctx, chA = sa.ch, chB = sb.ch\n const bind = await C.binding(C.CEREMONY, chA, chB)\n const iso = C.iso(when)\n const cardA = await C.signCard(ctxA, C.cardBody(ctxA, { name: a.name, challenge: { value: chA, issuedAt: iso } }), iso)\n const cardB = await C.signCard(ctxB, C.cardBody(ctxB, { name: b.name, challenge: { value: chB, issuedAt: iso } }), iso)\n const credA = await C.issueCredential(ctxA, ctxB.anchor, C.CEREMONY, chB, bind, iso)\n const credB = await C.issueCredential(ctxB, ctxA.anchor, C.CEREMONY, chA, bind, iso)\n const priorsA = snapshotPriors(a), priorsB = snapshotPriors(b) // Schnappschuss VOR dem frischen Tupel (6a)\n a.contacts.set(ctxB.anchor, { name: b.name, card: cardB, credential: credA, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxA, counterpartKa: cardB.keyAgreement }, priorCands: priorsA })\n b.contacts.set(ctxA.anchor, { name: a.name, card: cardA, credential: credB, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxB, counterpartKa: cardA.keyAgreement }, priorCands: priorsB })\n say(a, `Zeremonie mit ${b.name}: ✓ verifiziert (frisches Tupel)`)\n say(b, `Zeremonie mit ${a.name}: ✓ verifiziert (frisches Tupel)`)\n return { ctxA, ctxB, bind }\n}\n// Test-Shortcut: beide Schritte in einem Zug (Vorgeschichte in Szenarien)\nexport async function ceremony (a: Person, b: Person, when: number, ent: any = {}) {\n return ceremonyComplete(a, await ceremonyShow(a, { nonce: ent.nonceA, ch: ent.chA }),\n b, await ceremonyShow(b, { nonce: ent.nonceB, ch: ent.chB }), when)\n}\n\n// ── the rendezvous drop PORT: put/get by derived topic, opaque blobs ────\nexport function createDrop () {\n return {\n slots: new Map<string, string>(), // topic -> b64u blob\n log: [] as any[], // { n, op, topic, by }\n put (topic: string, blob: string, by: string) { this.slots.set(topic, blob); this.log.push({ n: this.log.length, op: 'put', topic: topic.slice(0, 16) + '…', by }) },\n get (topic: string, by: string) { this.log.push({ n: this.log.length, op: 'get', topic: topic.slice(0, 16) + '…', by }); return this.slots.get(topic) ?? null },\n }\n}\nconst dropTopic = async (secret: Uint8Array, dir: string) => C.b64uOf(await C.hkdf(secret, 'rltp/introduce/topic/' + dir))\nconst dropKey = async (secret: Uint8Array, dir: string) => S.importKey('raw', await C.hkdf(secret, 'rltp/introduce/key/' + dir), { name: 'AES-GCM' }, false, ['encrypt', 'decrypt'])\nasync function dropSeal (secret: Uint8Array, dir: string, obj: any, nonce: Uint8Array | undefined) {\n const n = nonce ?? C.rand(12)\n const ct = new Uint8Array(await S.encrypt({ name: 'AES-GCM', iv: n }, await dropKey(secret, dir), te.encode(jcs(obj))))\n return C.b64uOf(C.cat(n, ct))\n}\nasync function dropOpen (secret: Uint8Array, dir: string, blob: string) {\n try {\n const raw = C.fromB64u(blob)\n const pt = await S.decrypt({ name: 'AES-GCM', iv: raw.subarray(0, 12) }, await dropKey(secret, dir), raw.subarray(12))\n return JSON.parse(td.decode(new Uint8Array(pt)))\n } catch { return null }\n}\n\n// ── 1. the mediator's ONE act: \"Vorstellen…\" ────────────────────────────\n// Produces two sealed offers over the EXISTING channels. After this, the\n// mediator's device is done — nothing below ever touches it again.\n// Introducible are ✓ AND ⇄ contacts (Anton's cut, 24.08.) — but the offer\n// carries the mediator's OWN provenance toward the peer (met | introduced,\n// the vouch@2 vocabulary): the recipient decides informed, and a chain of\n// introductions never washes amber to blue — reach spreads, verification\n// does not. ◇ cannot mediate: no own channel context exists.\nexport async function introduce (m: Person, anchorA: string, anchorB: string, when: number, ent: any = {}) {\n const A = m.contacts.get(anchorA), B = m.contacts.get(anchorB)\n if (!A || !B) throw new Error('mediator does not hold both contacts')\n if (!A.channel?.own || !B.channel?.own) throw new Error('introducing needs a mutual channel to BOTH (◇ cannot mediate)')\n const secret = ent.secret ?? C.rand(32)\n const act = await C.digestBytes(secret) // act id: public handle, secret stays sealed\n const iso = C.iso(when)\n const provOf = (c: any) => c.provenance === 'ceremony' ? 'met' : 'introduced'\n const mk = async (mine: any, other: any, dir: string) => {\n // voucher FOR the counterpart, under M's channel anchor toward the counterpart;\n // it carries M's self-attested provenance toward the person it vouches for\n const voucher = await C.diSign(other.channel.own, { type: 'introduction-voucher@2', act, direction: dir, provenance: provOf(mine), issuedAt: iso }, iso)\n const offer = await C.diSign(mine.channel.own, {\n type: 'introduction-offer@2', act, direction: dir, issuedAt: iso,\n peer: { name: other.name, provenance: provOf(other) }, // M's LOCAL memory — words + honest basis, no anchors\n rendezvous: C.b64uOf(secret),\n voucherForCounterpart: voucher,\n }, iso)\n return C.seal(offer, mine.channel.counterpartKa, { ephSeed: ent.ephSeed, nonce: ent.sealNonce })\n }\n const envA = await mk(A, B, 'a')\n const envB = await mk(B, A, 'b')\n say(m, `Vorstellen: ${A.name} ⇠⇢ ${B.name} — zwei Angebote versiegelt, Akt ${act.slice(0, 12)}… · mein Gerät ist ab jetzt nicht mehr nötig`)\n return { act, offers: [{ to: anchorA, env: envA }, { to: anchorB, env: envB }] }\n}\n\n// ── 2. receiving the offer (each side, independently) ───────────────────\nexport async function receiveOffer (p: Person, env: any) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { duplicate: true } // kein Fehler: der Effekt ist längst da\n if (opened.error) return { error: opened.error }\n const r = await receiveOfferInner(p, env, opened.doc)\n if (!(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveOfferInner (p: Person, env: any, offer: any) {\n // form BEFORE fields (M-3; value forms per review 9, P-B1): the offer\n // binds ITS artifact form before anything enters the inbox\n if (!C.shaped(offer, { type: 'string', act: 'string', direction: 'string', rendezvous: 'string', issuedAt: 'string', peer: 'object', proof: 'object' })\n || offer.type !== 'introduction-offer@2'\n || (offer.direction !== 'a' && offer.direction !== 'b')\n || !C.calOK(offer.issuedAt)\n || !C.shaped(offer.peer, { name: 'string', provenance: 'string' })\n || (offer.peer.provenance !== 'met' && offer.peer.provenance !== 'introduced')) return { error: 'malformed offer' }\n try { if (C.fromB64u(offer.rendezvous).length !== 32) return { error: 'malformed offer' } }\n catch { return { error: 'malformed offer' } }\n // der mitreisende Voucher ist Teil der Offer-Form (Review 10, P-B1-Rest):\n // er wird beim Consent unbesehen ins Drop-Paket übernommen\n const v = offer.voucherForCounterpart\n if (!C.shaped(v, { type: 'string', act: 'string', direction: 'string', provenance: 'string', issuedAt: 'string', proof: 'object' })\n || v.type !== 'introduction-voucher@2' || v.act !== offer.act || !C.calOK(v.issuedAt)) return { error: 'malformed offer' }\n const from = [...p.contacts.entries()].find(([anchor, c]) => c.channel && offer.proof?.verificationMethod?.startsWith(anchor))\n if (!from) return { error: 'offer not from a held contact' }\n if (!(await C.diVerify(offer, from[0]))) return { error: 'offer proof fails' }\n const entry = { offer, mediator: from[1].name, mediatorAnchor: from[0], decided: false }\n p.inbox.push(entry)\n say(p, `${from[1].name} möchte dich mit ${offer.peer.name} verbinden`)\n return { entry }\n}\n\n// ── 3. consent: release the OWN card — independent of the other side.\n// Releasing and receiving are SEPARATE (ceremony-parallel): consent only\n// controls the own card; the counterpart's card arrives via sync\n// (checkDrop) whether or not this side ever consents.\nexport async function consent (p: Person, entry: any, drop: any, when: number, ent: any = {}) {\n if (!p.online) { p.queue.push(() => consent(p, entry, drop, when, ent)); say(p, 'offline — Freigabe wartet auf Netz'); return { queued: true } }\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const myDir = offer.direction\n const ctx = await freshCtx(p, ent.nonce)\n const iso = C.iso(when)\n const card = await C.signCard(ctx, C.cardBody(ctx, { name: p.name, challenge: { value: C.challengeOf(ent.ch ?? C.rand(17)), issuedAt: iso } }), iso)\n drop.put(await dropTopic(secret, myDir), await dropSeal(secret, myDir, { card, voucher: offer.voucherForCounterpart }, ent.dropNonce), p.name)\n entry.decided = true\n entry.released = true\n entry.ownCtx = ctx\n entry.ownCard = card\n say(p, `Verbinden mit ${offer.peer.name}: eigene Karte freigegeben (◇ gesendet)`)\n // if the counterpart's card is already held, the relationship is mutual now\n if (entry.counterpartAnchor) {\n const c = p.contacts.get(entry.counterpartAnchor)\n if (c) { c.state = '⇄'; c.channel.own = ctx; say(p, `⇄ verbunden mit ${c.name} — beide Karten liegen vor`) }\n }\n const fetched = await checkDrop(p, entry, drop)\n return { ctx, mutual: !!(entry.released && entry.counterpartAnchor) }\n}\n\n// ── 4. sync: fetch the counterpart's card — PASSIVE receipt, independent\n// of the own decision (like a shared contact arriving; ignoring the offer\n// never blocks what the other side chose to release) ────────────────────\nexport async function checkDrop (p: Person, entry: any, drop: any) {\n if (!p.online || entry.done) return null\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const otherDir = offer.direction === 'a' ? 'b' : 'a'\n const blob = drop.get(await dropTopic(secret, otherDir), p.name)\n if (!blob) return { mutual: false }\n const pkg = await dropOpen(secret, otherDir, blob)\n if (!pkg) { say(p, 'Drop-Blob unlesbar (falsches Geheimnis?)'); return { error: 'undecryptable' } }\n // form BEFORE fields (M-3), THEN the cryptography — and the card runs\n // through its CLOSED wire-0.25 schema, not an ad-hoc field list\n // (review 3, M-4: a valid signature binds a schema-violating card too)\n if (!C.shaped(pkg, { card: 'object', voucher: 'object' })\n || !C.shaped(pkg.voucher, { act: 'string' })) { say(p, 'Drop-Paket formwidrig'); return { error: 'malformed' } }\n {\n const s = SCHEMAS['contact-card.schema.json']\n const errs = VAL.validate(pkg.card, s, s)\n if (errs.length) { say(p, 'Karte schema-widrig: ' + errs[0]); return { error: 'card schema' } }\n }\n // the counterpart card: schema + DI; the voucher: signed by MY mediator\n if (!(await C.diVerify(pkg.card, pkg.card.anchor))) { say(p, 'Karte verifiziert nicht'); return { error: 'card' } }\n if (!(await C.diVerify(pkg.voucher, entry.mediatorAnchor)) || pkg.voucher.act !== offer.act) { say(p, 'Voucher verifiziert nicht unter meinem Vermittler'); return { error: 'voucher' } }\n entry.done = true\n entry.counterpartAnchor = pkg.card.anchor\n const mutual = !!entry.released\n const priors = snapshotPriors(p) // Schnappschuss VOR dem frischen Tupel (6a)\n p.contacts.set(pkg.card.anchor, {\n name: pkg.card.name, card: pkg.card, provenance: `introduced via ${entry.mediator}`, since: entry.offer.issuedAt,\n mediatorProvenance: entry.offer.peer.provenance ?? 'met', priorCands: priors,\n state: mutual ? '⇄' : '◇', channel: { own: entry.ownCtx ?? null, counterpartKa: pkg.card.keyAgreement },\n voucher: pkg.voucher,\n })\n say(p, mutual ? `⇄ verbunden mit ${pkg.card.name} — via ${entry.mediator} (Voucher geprüft)` : `◇ ${pkg.card.name} erhalten — vorgestellt via ${entry.mediator} (einseitig; du hast nichts freigegeben)`)\n return { mutual, card: pkg.card }\n}\n\n// ── device lifecycle ────────────────────────────────────────────────────\nexport async function setOnline (p: Person, online: boolean, drop: any) {\n p.online = online\n say(p, online ? 'online' : 'offline (Flugmodus)')\n if (online) {\n const q = p.queue.splice(0)\n for (const fn of q) await fn()\n for (const e of p.inbox) if (!e.kind) await checkDrop(p, e, drop) // nur Vorstellungs-Angebote haben einen Drop\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"introduce.js","sourceRoot":"","sources":["../../src/probe/introduce.ts"],"names":[],"mappings":"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","sourcesContent":["// introduce.mjs — the introduction act, PROBE for the §8 recast.\n// DOM-free, deterministic-capable, on rltp-core + rltp-crypto.\n//\n// THE MODEL (Anton's cuts, 25.08. — supersedes converged §8@1's\n// requester-initiated ferry):\n// 1. MEDIATOR-INITIATED: only M can point at both parties (a requester\n// has no in-app handle for the target; the verbal wish lives in real\n// life). M opens a contact, taps \"Vorstellen…\", picks the other.\n// 2. INDEPENDENT RELEASE (ceremony-parallel): both sides receive the\n// offer simultaneously; EACH consent releases that person's OWN\n// fresh card — one-sided outcomes stay first-class (◇), mutuality\n// arises when both have released (⇄).\n// 3. RENDEZVOUS DROP, not ferry: the offers carry a per-act secret;\n// consenting devices deposit their sealed card at a derived topic\n// and fetch the counterpart's — THE MEDIATOR IS NEVER NEEDED AGAIN\n// after the initiating act (airplane-mode scenario). The drop is a\n// PORT (put/get by derived topic, opaque blobs, TTL); relay-topic /\n// DHT / iroh node / M's device are adapters below it.\n// 4. The mediator VOUCHER binds the ACT, not the card (the drop model\n// makes card-digest vouchers impossible — M never sees the cards;\n// harvest finding for the recast). Each offer carries the voucher\n// FOR THE COUNTERPART, signed under M's channel anchor toward that\n// counterpart; the consenting side deposits it beside its card, so\n// the fetcher verifies \"this introduction came from MY M\".\n// Trust: M remains the authenticity anchor of the introduction either\n// way; the systemic control is the first real encounter (◇→✓,\n// continuity). Deniability/linkability hardening is RECAST WORK — this\n// probe signs plainly and says so.\nimport { jcs, makeValidator, tsec } from '../core.js'\nimport { SCHEMAS } from '../schemas.js'\nconst VAL = makeValidator(SCHEMAS)\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { snapshotPriors } from './continuity.js'\n\nconst te = new TextEncoder(), td = new TextDecoder()\nconst S = globalThis.crypto.subtle\n\n// ── people ──────────────────────────────────────────────────────────────\nexport function createPerson (name: string, rootIkm?: Uint8Array): Person {\n return {\n name,\n rootIkm: rootIkm ?? C.rand(64),\n contexts: new Map(), // anchor/keyAgreement -> pair ctx (fresh-always)\n contacts: new Map(), // counterpart anchor -> { name, card, provenance, state, channel }\n inbox: [], // received offers/invites awaiting the human\n groups: new Map(), // genesisDigest -> group state (Stage C, groups.mjs)\n online: true,\n queue: [], // actions deferred while offline (device ferry of ONESELF)\n log: [],\n // the demo community's genesis — a PROBE FIXTURE the person carries,\n // so the strict identity layer never needs a default\n communityGenesis: C.COMMUNITY_GENESIS,\n }\n}\nconst say = (p: Person, m: string) => p.log.push(m)\nexport async function freshCtx (p: Person, nonce?: Uint8Array) {\n const ctx = await C.pairContext(p.rootIkm, nonce ?? C.rand(32))\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\n\n// ── die Zeremonie in SCHRITTEN — die App-Choreografie (Encounter 5.2):\n// Code zeigen → scannen → BEIDE bestätigen bewusst; erst dann entsteht\n// das Enactment. Der gezeigte Anker ist immer frisch (4.4) und verrät\n// nichts — wer ihn wirklich trifft, klärt hinterher die §6a-Probe.\nexport async function ceremonyShow (p: Person, ent: any = {}) {\n const ctx = await freshCtx(p, ent.nonce)\n return { ctx, ch: C.challengeOf(ent.ch ?? C.rand(17)) }\n}\nexport async function ceremonyComplete (a: Person, sa: any, b: Person, sb: any, when: number) {\n const ctxA = sa.ctx, ctxB = sb.ctx, chA = sa.ch, chB = sb.ch\n const bind = await C.binding(C.CEREMONY, chA, chB)\n const iso = C.iso(when)\n const cardA = await C.signCard(ctxA, C.cardBody(ctxA, { name: a.name, challenge: { value: chA, issuedAt: iso } }), iso)\n const cardB = await C.signCard(ctxB, C.cardBody(ctxB, { name: b.name, challenge: { value: chB, issuedAt: iso } }), iso)\n const credA = await C.issueCredential(ctxA, ctxB.anchor, C.CEREMONY, chB, bind, iso)\n const credB = await C.issueCredential(ctxB, ctxA.anchor, C.CEREMONY, chA, bind, iso)\n const priorsA = snapshotPriors(a), priorsB = snapshotPriors(b) // Schnappschuss VOR dem frischen Tupel (6a)\n a.contacts.set(ctxB.anchor, { name: b.name, card: cardB, credential: credA, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxA, counterpartKa: cardB.keyAgreement }, priorCands: priorsA })\n b.contacts.set(ctxA.anchor, { name: a.name, card: cardA, credential: credB, provenance: 'ceremony', state: '✓', since: iso, channel: { own: ctxB, counterpartKa: cardA.keyAgreement }, priorCands: priorsB })\n say(a, `Zeremonie mit ${b.name}: ✓ verifiziert (frisches Tupel)`)\n say(b, `Zeremonie mit ${a.name}: ✓ verifiziert (frisches Tupel)`)\n return { ctxA, ctxB, bind }\n}\n// Test-Shortcut: beide Schritte in einem Zug (Vorgeschichte in Szenarien)\nexport async function ceremony (a: Person, b: Person, when: number, ent: any = {}) {\n return ceremonyComplete(a, await ceremonyShow(a, { nonce: ent.nonceA, ch: ent.chA }),\n b, await ceremonyShow(b, { nonce: ent.nonceB, ch: ent.chB }), when)\n}\n\n// ── the rendezvous drop PORT: put/get by derived topic, opaque blobs ────\nexport function createDrop () {\n return {\n slots: new Map<string, string>(), // topic -> b64u blob\n log: [] as any[], // { n, op, topic, by }\n put (topic: string, blob: string, by: string) { this.slots.set(topic, blob); this.log.push({ n: this.log.length, op: 'put', topic: topic.slice(0, 16) + '…', by }) },\n get (topic: string, by: string) { this.log.push({ n: this.log.length, op: 'get', topic: topic.slice(0, 16) + '…', by }); return this.slots.get(topic) ?? null },\n }\n}\nconst dropTopic = async (secret: Uint8Array, dir: string) => C.b64uOf(await C.hkdf(secret, 'rltp/introduce/topic/' + dir))\nconst dropKey = async (secret: Uint8Array, dir: string) => S.importKey('raw', await C.hkdf(secret, 'rltp/introduce/key/' + dir), { name: 'AES-GCM' }, false, ['encrypt', 'decrypt'])\nasync function dropSeal (secret: Uint8Array, dir: string, obj: any, nonce: Uint8Array | undefined) {\n const n = nonce ?? C.rand(12)\n const ct = new Uint8Array(await S.encrypt({ name: 'AES-GCM', iv: n }, await dropKey(secret, dir), te.encode(jcs(obj))))\n return C.b64uOf(C.cat(n, ct))\n}\nasync function dropOpen (secret: Uint8Array, dir: string, blob: string) {\n try {\n const raw = C.fromB64u(blob)\n const pt = await S.decrypt({ name: 'AES-GCM', iv: raw.subarray(0, 12) }, await dropKey(secret, dir), raw.subarray(12))\n return JSON.parse(td.decode(new Uint8Array(pt)))\n } catch { return null }\n}\n\n// ── 1. the mediator's ONE act: \"Vorstellen…\" ────────────────────────────\n// Produces two sealed offers over the EXISTING channels. After this, the\n// mediator's device is done — nothing below ever touches it again.\n// Introducible are ✓ AND ⇄ contacts (Anton's cut, 24.08.) — but the offer\n// carries the mediator's OWN provenance toward the peer (met | introduced,\n// the vouch@2 vocabulary): the recipient decides informed, and a chain of\n// introductions never washes amber to blue — reach spreads, verification\n// does not. ◇ cannot mediate: no own channel context exists.\nexport async function introduce (m: Person, anchorA: string, anchorB: string, when: number, ent: any = {}) {\n const A = m.contacts.get(anchorA), B = m.contacts.get(anchorB)\n if (!A || !B) throw new Error('mediator does not hold both contacts')\n if (!A.channel?.own || !B.channel?.own) throw new Error('introducing needs a mutual channel to BOTH (◇ cannot mediate)')\n const secret = ent.secret ?? C.rand(32)\n const act = await C.digestBytes(secret) // act id: public handle, secret stays sealed\n const iso = C.iso(when)\n const provOf = (c: any) => c.provenance === 'ceremony' ? 'met' : 'introduced'\n const mk = async (mine: any, other: any, dir: string) => {\n // voucher FOR the counterpart, under M's channel anchor toward the counterpart;\n // it carries M's self-attested provenance toward the person it vouches for\n const voucher = await C.diSign(other.channel.own, { type: 'introduction-voucher@2', act, direction: dir, provenance: provOf(mine), issuedAt: iso }, iso)\n const offer = await C.diSign(mine.channel.own, {\n type: 'introduction-offer@2', act, direction: dir, issuedAt: iso,\n peer: { name: other.name, provenance: provOf(other) }, // M's LOCAL memory — words + honest basis, no anchors\n rendezvous: C.b64uOf(secret),\n voucherForCounterpart: voucher,\n }, iso)\n return C.seal(offer, mine.channel.counterpartKa, { ephSeed: ent.ephSeed, nonce: ent.sealNonce })\n }\n const envA = await mk(A, B, 'a')\n const envB = await mk(B, A, 'b')\n say(m, `Vorstellen: ${A.name} ⇠⇢ ${B.name} — zwei Angebote versiegelt, Akt ${act.slice(0, 12)}… · mein Gerät ist ab jetzt nicht mehr nötig`)\n return { act, offers: [{ to: anchorA, env: envA }, { to: anchorB, env: envB }] }\n}\n\n// ── 2. receiving the offer (each side, independently) ───────────────────\nexport async function receiveOffer (p: Person, env: any) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { duplicate: true } // kein Fehler: der Effekt ist längst da\n if (opened.error) return { error: opened.error }\n const r = await receiveOfferInner(p, env, opened.doc)\n if (!(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveOfferInner (p: Person, env: any, offer: any) {\n // form BEFORE fields (M-3; value forms per review 9, P-B1): the offer\n // binds ITS artifact form before anything enters the inbox\n if (!C.shaped(offer, { type: 'string', act: 'string', direction: 'string', rendezvous: 'string', issuedAt: 'string', peer: 'object', proof: 'object' })\n || offer.type !== 'introduction-offer@2'\n || (offer.direction !== 'a' && offer.direction !== 'b')\n || !C.calOK(offer.issuedAt)\n || !C.shaped(offer.peer, { name: 'string', provenance: 'string' })\n || (offer.peer.provenance !== 'met' && offer.peer.provenance !== 'introduced')) return { error: 'malformed offer' }\n try { if (C.fromB64u(offer.rendezvous).length !== 32) return { error: 'malformed offer' } }\n catch { return { error: 'malformed offer' } }\n // der mitreisende Voucher ist Teil der Offer-Form (Review 10, P-B1-Rest):\n // er wird beim Consent unbesehen ins Drop-Paket übernommen\n const v = offer.voucherForCounterpart\n if (!C.shaped(v, { type: 'string', act: 'string', direction: 'string', provenance: 'string', issuedAt: 'string', proof: 'object' })\n || v.type !== 'introduction-voucher@2' || v.act !== offer.act || !C.calOK(v.issuedAt)) return { error: 'malformed offer' }\n const from = [...p.contacts.entries()].find(([anchor, c]) => c.channel && offer.proof?.verificationMethod?.startsWith(anchor))\n if (!from) return { error: 'offer not from a held contact' }\n if (!(await C.diVerify(offer, from[0]))) return { error: 'offer proof fails' }\n const entry = { offer, mediator: from[1].name, mediatorAnchor: from[0], decided: false }\n p.inbox.push(entry)\n say(p, `${from[1].name} möchte dich mit ${offer.peer.name} verbinden`)\n return { entry }\n}\n\n// ── 3. consent: release the OWN card — independent of the other side.\n// Releasing and receiving are SEPARATE (ceremony-parallel): consent only\n// controls the own card; the counterpart's card arrives via sync\n// (checkDrop) whether or not this side ever consents.\nexport async function consent (p: Person, entry: any, drop: any, when: number, ent: any = {}) {\n // the release happens once: a repeated consent keeps the released context\n // and card (a new pair would orphan the channel the counterpart holds);\n // a call while the release is in flight shares it (single-flight, #8)\n if (entry.released) return { ctx: entry.ownCtx, mutual: !!entry.counterpartAnchor }\n if (entry.releasing) return entry.releasing\n if (!p.online) { p.queue.push(() => consent(p, entry, drop, when, ent)); say(p, 'offline — Freigabe wartet auf Netz'); return { queued: true } }\n entry.releasing = release(p, entry, drop, when, ent).finally(() => { entry.releasing = null })\n return entry.releasing\n}\nasync function release (p: Person, entry: any, drop: any, when: number, ent: any) {\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const myDir = offer.direction\n const ctx = await freshCtx(p, ent.nonce)\n const iso = C.iso(when)\n const card = await C.signCard(ctx, C.cardBody(ctx, { name: p.name, challenge: { value: C.challengeOf(ent.ch ?? C.rand(17)), issuedAt: iso } }), iso)\n drop.put(await dropTopic(secret, myDir), await dropSeal(secret, myDir, { card, voucher: offer.voucherForCounterpart }, ent.dropNonce), p.name)\n entry.decided = true\n entry.released = true\n entry.ownCtx = ctx\n entry.ownCard = card\n say(p, `Verbinden mit ${offer.peer.name}: eigene Karte freigegeben (◇ gesendet)`)\n // if the counterpart's card is already held, the relationship is mutual now\n if (entry.counterpartAnchor) {\n const c = p.contacts.get(entry.counterpartAnchor)\n if (c) { c.state = '⇄'; c.channel.own = ctx; say(p, `⇄ verbunden mit ${c.name} — beide Karten liegen vor`) }\n }\n const fetched = await checkDrop(p, entry, drop)\n return { ctx, mutual: !!(entry.released && entry.counterpartAnchor) }\n}\n\n// ── 4. sync: fetch the counterpart's card — PASSIVE receipt, independent\n// of the own decision (like a shared contact arriving; ignoring the offer\n// never blocks what the other side chose to release) ────────────────────\nexport async function checkDrop (p: Person, entry: any, drop: any) {\n if (!p.online || entry.done) return null\n const { offer } = entry\n const secret = C.fromB64u(offer.rendezvous)\n const otherDir = offer.direction === 'a' ? 'b' : 'a'\n const blob = drop.get(await dropTopic(secret, otherDir), p.name)\n if (!blob) return { mutual: false }\n const pkg = await dropOpen(secret, otherDir, blob)\n if (!pkg) { say(p, 'Drop-Blob unlesbar (falsches Geheimnis?)'); return { error: 'undecryptable' } }\n // form BEFORE fields (M-3), THEN the cryptography — and the card runs\n // through its CLOSED wire-0.25 schema, not an ad-hoc field list\n // (review 3, M-4: a valid signature binds a schema-violating card too)\n if (!C.shaped(pkg, { card: 'object', voucher: 'object' })\n || !C.shaped(pkg.voucher, { act: 'string' })) { say(p, 'Drop-Paket formwidrig'); return { error: 'malformed' } }\n {\n const s = SCHEMAS['contact-card.schema.json']\n const errs = VAL.validate(pkg.card, s, s)\n if (errs.length) { say(p, 'Karte schema-widrig: ' + errs[0]); return { error: 'card schema' } }\n }\n // the counterpart card: schema + DI; the voucher: signed by MY mediator\n if (!(await C.diVerify(pkg.card, pkg.card.anchor))) { say(p, 'Karte verifiziert nicht'); return { error: 'card' } }\n if (!(await C.diVerify(pkg.voucher, entry.mediatorAnchor)) || pkg.voucher.act !== offer.act) { say(p, 'Voucher verifiziert nicht unter meinem Vermittler'); return { error: 'voucher' } }\n entry.done = true\n entry.counterpartAnchor = pkg.card.anchor\n const mutual = !!entry.released\n const priors = snapshotPriors(p) // Schnappschuss VOR dem frischen Tupel (6a)\n p.contacts.set(pkg.card.anchor, {\n name: pkg.card.name, card: pkg.card, provenance: `introduced via ${entry.mediator}`, since: entry.offer.issuedAt,\n mediatorProvenance: entry.offer.peer.provenance ?? 'met', priorCands: priors,\n state: mutual ? '⇄' : '◇', channel: { own: entry.ownCtx ?? null, counterpartKa: pkg.card.keyAgreement },\n voucher: pkg.voucher,\n })\n say(p, mutual ? `⇄ verbunden mit ${pkg.card.name} — via ${entry.mediator} (Voucher geprüft)` : `◇ ${pkg.card.name} erhalten — vorgestellt via ${entry.mediator} (einseitig; du hast nichts freigegeben)`)\n return { mutual, card: pkg.card }\n}\n\n// ── device lifecycle ────────────────────────────────────────────────────\nexport async function setOnline (p: Person, online: boolean, drop: any) {\n p.online = online\n say(p, online ? 'online' : 'offline (Flugmodus)')\n if (online) {\n const q = p.queue.splice(0)\n for (const fn of q) await fn()\n for (const e of p.inbox) if (!e.kind) await checkDrop(p, e, drop) // nur Vorstellungs-Angebote haben einen Drop\n }\n}\n"]}
|
|
@@ -34,10 +34,16 @@ export declare function receiveDoc(p: Person, env: any, when: number, ent?: any)
|
|
|
34
34
|
}[];
|
|
35
35
|
error?: undefined;
|
|
36
36
|
idempotent?: undefined;
|
|
37
|
+
} | {
|
|
38
|
+
handled: boolean;
|
|
39
|
+
idempotent: boolean;
|
|
40
|
+
error?: undefined;
|
|
41
|
+
joined?: undefined;
|
|
37
42
|
} | {
|
|
38
43
|
handled: boolean;
|
|
39
44
|
joined: any;
|
|
40
45
|
error?: undefined;
|
|
46
|
+
idempotent?: undefined;
|
|
41
47
|
} | {
|
|
42
48
|
handled: boolean;
|
|
43
49
|
idempotent: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAYvC,wBAAsB,aAAa,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAKpE;AAKD,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAoBtF;AAWD,wBAAsB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAYzH;AAID,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ
|
|
1
|
+
{"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAYvC,wBAAsB,aAAa,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAKpE;AAKD,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ,gBAoBtF;AAWD,wBAAsB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAYzH;AAID,wBAAsB,UAAU,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOjF;AAoDD,wBAAsB,WAAW,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAqB7I;AAyBD,wBAAsB,YAAY,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;GAoBrF;AAkGD,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;GA2BtI"}
|
package/dist/probe/membership.js
CHANGED
|
@@ -329,7 +329,7 @@ const Buffer_ = (s) => new TextEncoder().encode(s).length;
|
|
|
329
329
|
async function handleWelcome(p, doc, from) {
|
|
330
330
|
// form BEFORE fields (M-3): the roster travels as data and becomes
|
|
331
331
|
// this person's map — every entry earns its shape before adoption
|
|
332
|
-
if (!C.shaped(doc, { issuer: 'string', recipient: 'string', payload: 'object', proof: 'object' })
|
|
332
|
+
if (!C.shaped(doc, { issuer: 'string', recipient: 'string', threadId: 'string', payload: 'object', proof: 'object' })
|
|
333
333
|
|| !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string', roster: 'array' })
|
|
334
334
|
|| !doc.payload.roster.every((m) => C.shaped(m, { anchor: 'string', name: 'string', addedAt: 'string' })))
|
|
335
335
|
return { handled: true, error: 'malformed welcome' };
|
|
@@ -347,6 +347,22 @@ async function handleWelcome(p, doc, from) {
|
|
|
347
347
|
}
|
|
348
348
|
if (doc.recipient !== my.anchor)
|
|
349
349
|
return { handled: true, error: 'welcome not for my member anchor' };
|
|
350
|
+
// a held group is never rewritten by a later welcome
|
|
351
|
+
if (p.groups.has(gd))
|
|
352
|
+
return { handled: true, idempotent: true };
|
|
353
|
+
// the welcome answers an invitation THIS device accepted (Membership
|
|
354
|
+
// Tasks: it travels in the invite's thread, from the inviter, for the
|
|
355
|
+
// accept's subject and the invited group) — a signed welcome from a held
|
|
356
|
+
// contact without that binding adopts nothing
|
|
357
|
+
const entry = p.inbox.find((e) => e.kind === 'invite' && e.accepted && !e.welcomed
|
|
358
|
+
&& e.invite.taskContext === doc.threadId && e.invite.issuer === doc.issuer
|
|
359
|
+
&& e.myMemberCtx.anchor === doc.recipient
|
|
360
|
+
&& e.invite.credentialSubject.genesisDigest === gd && e.invite.credentialSubject.group === doc.payload.group);
|
|
361
|
+
if (!entry)
|
|
362
|
+
return { handled: true, error: 'welcome without an accepted invitation' };
|
|
363
|
+
const listed = new Set(doc.payload.roster.map((m) => m.anchor));
|
|
364
|
+
if (!listed.has(doc.issuer) || !listed.has(my.anchor))
|
|
365
|
+
return { handled: true, error: 'welcome roster omits its issuer or subject' };
|
|
350
366
|
const g = {
|
|
351
367
|
label: doc.payload.label, groupDid: doc.payload.group, genesisDigest: gd,
|
|
352
368
|
genesis: doc.payload.genesis, myMemberCtx: my, role: 'member',
|
|
@@ -357,6 +373,7 @@ async function handleWelcome(p, doc, from) {
|
|
|
357
373
|
};
|
|
358
374
|
g.myAcceptDigest = g.roster.get(my.anchor)?.acceptDigest ?? null;
|
|
359
375
|
p.groups.set(gd, g);
|
|
376
|
+
entry.welcomed = true;
|
|
360
377
|
if (from)
|
|
361
378
|
(from.sharedGroups ??= []).push(gd); // der Invitee WEISS, wer ihn eingeladen hat
|
|
362
379
|
say(p, `Willkommen in „${g.label}" — Roster mit ${g.roster.size} Mitgliedern übernommen`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"membership.js","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"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","sourcesContent":["// groups.mjs — Stage C: groups over the introduced channel. PROBE.\n// DOM-free, on rltp-core + rltp-crypto (+ the shipped schemas: the invite\n// IS the DTG InvitationCredential of membership-invite/0.2, the accept IS\n// membership-accept/0.2 — both schema-validated at issuance AND receipt).\n//\n// WHAT THIS PROBE EXERCISES (the converged Membership 0.16 / Access 0.30\n// semantics, instantiated live):\n// founding — the founder signs the genesis under a FOUNDING pair\n// context (Access 3.4.1: group/<digest> cannot exist\n// before the digest does); genesisDigest = multihash\n// over the proof-free genesis; the founder then derives\n// the member anchor group/<digest> and self-enrolls.\n// prelude — the inviter cannot derive the invitee's member anchor;\n// the invitee's app derives it from the genesisDigest\n// (canonical-u before the label, Access 5.1) and answers\n// over the EXISTING relationship channel (Membership 1.2).\n// invite — a conformant DTG InvitationCredential in a delivery\n// document WITHOUT a document proof (one carrier,\n// Membership 2); invitee re-derives and compares\n// (the prelude check, Membership 3.1).\n// accept — consent, task-proved under the subject; ref = the\n// CREDENTIAL digest (decoded-bytes equality).\n// admission — the inviter runs the Access 5.3 pair-internal checks\n// (path convention, time window incl. membership-skew,\n// size budget, card enclosure profile) and updates the\n// roster; a WELCOME (probe form) carries the roster to\n// members over their channels.\n// OUT OF PROBE SCOPE (named, not faked): the full access-operation\n// envelope (oid/prev/epochs), welcome seal + keydist/epoch keys, vouch\n// paths and candidacy surfacing, removal. That is the library's next\n// growth ring — the checks here are the real ones, the transport forms\n// marked @probe are not wire-normative.\nimport { jcs, makeValidator, toU, sameDigest, tsec, calOK } from '../core.js'\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { SCHEMAS } from '../schemas.js'\n\nconst V = makeValidator(SCHEMAS)\nconst validOr = (data: any, file: string) => { const s = SCHEMAS[file]; const errs = V.validate(data, s, s); if (errs.length) throw new Error(file + ': ' + errs[0]); return data }\nconst MEMBERSHIP_SKEW = 300 // PT5M (Membership §5)\nconst TT = 'https://real-life.org/trust-tasks/'\nconst CTX3 = ['https://www.w3.org/ns/credentials/v2', 'https://firstperson.network/credentials/dtg/v1', 'https://real-life.org/rltp/v1']\nconst say = (p: Person, m: string) => p.log.push(m)\nconst uuid = (ent?: any) => ent ?? globalThis.crypto.randomUUID()\n\n// member anchor: canonical-u re-encoding BEFORE the label (Access 5.1)\nexport async function memberContext (p: Person, genesisDigest: string) {\n const label = 'group/' + toU(genesisDigest)\n const ctx = await C.labeledContext(p.rootIkm, label)\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\nconst memberCard = async (ctx: any, name: string, whenIso: string) =>\n validOr(await C.signCard(ctx, C.cardBody(ctx, { name }), whenIso), 'contact-card.schema.json')\n\n// ── founding ────────────────────────────────────────────────────────────\nexport async function foundGroup (p: Person, label: string, when: number, ent: any = {}) {\n const iso = C.iso(when)\n const founding = await C.pairContext(p.rootIkm, ent.foundingNonce ?? C.rand(32)) // pair class: the founding occasion\n const groupDid = C.anchorOfEd((await C.edFromSeed(ent.groupSeed ?? C.rand(32))).pubRaw) // group address (probe mint; Identity work)\n const genesisBody = { type: 'group-genesis@probe', group: groupDid, label, founder: founding.anchor, issuedAt: iso }\n const genesis = await C.diSign(founding, genesisBody, iso)\n const genesisDigest = await C.digestDoc(genesisBody) // proof-free signature input (Access 3.2)\n const my = await memberContext(p, genesisDigest)\n const card = await memberCard(my, p.name, iso)\n const g: any = {\n label, groupDid, genesisDigest, genesis, myMemberCtx: my, role: 'founder',\n vouchThreshold: ent.vouchThreshold ?? 1, // Bürgschaftsschwelle (Gruppenregel; UI zeigt sie nur > 1)\n vouchesReceived: new Map(), // Bürgschaften FÜR MICH (issuer -> vouch@2)\n myVouches: new Map(), // Bürgschaften VON MIR (candidate -> vouch@2)\n roster: new Map([[my.anchor, { name: p.name, card, addedAt: iso, founder: true }]]),\n threads: new Map(), // invitee member anchor -> { threadId, invite } (open invitations)\n }\n p.groups.set(genesisDigest, g)\n say(p, `Gruppe „${label}\" gegründet — Genesis unter Gründungs-pair-Anker, Member-Anker ${my.anchor.slice(0, 20)}… abgeleitet`)\n return g\n}\n\n// ── transport helper: sealed doc over an existing relationship channel ──\nasync function sendDoc (p: Person, contact: any, doc: any, ent: any = {}) {\n return { to: contact, env: await C.seal(doc, contact.channel.counterpartKa, ent) }\n}\nconst channelCtxOf = (p: Person, doc: any) => p.contexts.get(doc.recipient) ?? null\nconst contactByAnchor = (p: Person, anchor: string) => p.contacts.get(anchor) ?? null\nconst contactOfIssuer = (p: Person, issuer: string) => p.contacts.get(issuer) ?? null\n\n// ── prelude (Membership 1.2/3.1: the invitee supplies the member anchor) ─\nexport async function preludeRequest (p: Person, contactAnchor: string, genesisDigest: string, when: number, ent: any = {}) {\n const contact = contactByAnchor(p, contactAnchor)\n const g = p.groups.get(genesisDigest)\n const body = {\n id: uuid(ent.id), type: TT + 'membership-prelude-request@probe',\n issuer: contact.channel.own.anchor, recipient: contactAnchor,\n threadId: uuid(ent.threadId), issuedAt: C.iso(when),\n payload: { genesisDigest, group: g.groupDid, label: g.label },\n }\n const doc = await C.diSign(contact.channel.own, body, C.iso(when))\n say(p, `Prelude an ${contact.name}: genesisDigest der Gruppe „${g.label}\" über den Beziehungs-Kanal`)\n return sendDoc(p, contact, doc, ent)\n}\n\n// ── receive dispatch: every membership doc travels the channel sealed ───\n// Returns { handled, outbound?: [{to, env}], prompt?: entry }.\nexport async function receiveDoc (p: Person, env: any, when: number, ent: any = {}) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { handled: true, duplicate: true }\n if (opened.error) return { handled: false }\n const r = await receiveDocInner(p, env, opened.doc, when, ent)\n if (r?.handled && !(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveDocInner (p: Person, env: any, doc: any, when: number, ent: any = {}) {\n const ctx = channelCtxOf(p, { recipient: env.rkid }) ?? p.contexts.get(env.rkid)\n if (!ctx) return { handled: false }\n if (typeof doc?.type !== 'string' || !doc.type.startsWith(TT + 'membership-')) return { handled: false, doc }\n // the sender is identified by the CHANNEL the envelope arrived on (rkid\n // names our own pair context of exactly one relationship) — membership\n // documents carry MEMBER anchors as issuer, which no contact key holds\n const from = [...p.contacts.values()].find((c) => c.channel?.own?.anchor === ctx.anchor) ?? contactOfIssuer(p, doc.issuer)\n switch (doc.type.slice((TT + 'membership-').length)) {\n case 'prelude-request@probe': {\n // form BEFORE fields (review 3, M-3): a valid signature binds\n // whatever was signed — payload.genesisDigest earns its type here\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string' })) return { handled: true, error: 'malformed prelude' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude proof' }\n let my\n try { my = await memberContext(p, doc.payload.genesisDigest) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n const body = {\n id: uuid(), type: TT + 'membership-prelude-reply@probe',\n issuer: from.channel.own.anchor, recipient: doc.issuer,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: doc.payload.genesisDigest, memberAnchor: my.anchor },\n }\n const reply = await C.diSign(from.channel.own, body, C.iso(when))\n say(p, `Prelude von ${from.name}: Member-Anker für „${doc.payload.label}\" abgeleitet und geantwortet`)\n return { handled: true, outbound: [await sendDoc(p, from, reply, ent)] }\n }\n case 'prelude-reply@probe': {\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', memberAnchor: 'string' })\n || C.edRawOfAnchor(doc.payload.memberAnchor) === null) return { handled: true, error: 'malformed prelude-reply' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude-reply proof' }\n const g = [...p.groups.values()].find((g) => g.genesisDigest === doc.payload.genesisDigest)\n if (!g) return { handled: true, error: 'unknown group' }\n // Log erst NACH dem gelungenen Bau; ein Schema-Throw aus\n // buildInvite verlässt die Empfangs-Promise nie (Review 9, P-B2)\n let inv\n try { inv = await buildInvite(p, g, from, doc.payload.memberAnchor, when, doc.threadId, ent) }\n catch (e: any) { return { handled: true, error: 'invite build: ' + String(e?.message ?? e) } }\n say(p, `${from.name}s Member-Anker erhalten — Einladung wird ausgestellt`)\n return { handled: true, outbound: [inv] }\n }\n case 'invite/0.2': return handleInvite(p, doc, from, when)\n case 'accept/0.2': return handleAccept(p, doc, from, when, ent)\n case 'welcome@probe': return handleWelcome(p, doc, from)\n case 'vouch/0.1': return handleVouch(p, doc, from)\n }\n return { handled: false, doc }\n}\n\n// ── the invite: a conformant DTG InvitationCredential (one carrier) ─────\nexport async function buildInvite (p: Person, g: any, contact: any, inviteeMemberAnchor: string, when: number, threadId: string, ent: any = {}) {\n const iso = C.iso(when), until = C.iso(when + 24 * 3600 * 1000)\n const inviterCard = await memberCard(g.myMemberCtx, p.name, iso)\n const credBody = {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'InvitationCredential', 'MembershipInvite'],\n issuer: g.myMemberCtx.anchor,\n credentialSubject: { id: inviteeMemberAnchor, group: g.groupDid, genesisDigest: g.genesisDigest, card: inviterCard, name: g.label },\n validFrom: iso, validUntil: until, taskContext: threadId,\n }\n const invite = await C.diSign(g.myMemberCtx, credBody, iso)\n validOr({ invite }, 'payload-membership-invite.schema.json')\n const doc = { // document-level proof ABSENT: the credential is the one carrier (Membership 2)\n id: uuid(ent.docId), type: TT + 'membership-invite/0.2',\n issuer: g.myMemberCtx.anchor, recipient: inviteeMemberAnchor,\n threadId, issuedAt: iso, payload: { invite },\n }\n validOr(doc, 'rltp-delivery-document.schema.json')\n g.threads.set(inviteeMemberAnchor, { threadId, invite, contactAnchor: [...p.contacts.entries()].find(([, c]) => c === contact)![0] })\n say(p, `Einladung (InvitationCredential) an ${contact.name} — Thread ${threadId.slice(0, 8)}…`)\n return sendDoc(p, contact, doc, ent)\n}\n\nasync function handleInvite (p: Person, doc: any, from: any, when: number) {\n if (!from) return { handled: true, error: 'invite not from a held contact' }\n const inv = doc.payload?.invite\n try { validOr(doc.payload, 'payload-membership-invite.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch (e: any) { say(p, 'Einladung schema-ungültig: ' + e.message); return { handled: true, error: 'schema' } }\n if ('proof' in doc) { say(p, 'Einladung trägt Dokument-Proof — one carrier verletzt'); return { handled: true, error: 'one-carrier' } }\n if (!(await C.diVerify(inv, inv.issuer))) return { handled: true, error: 'credential proof' }\n if (inv.issuer !== doc.issuer || inv.credentialSubject.id !== doc.recipient || inv.taskContext !== doc.threadId) return { handled: true, error: 'document bindings' }\n if (inv.credentialSubject.card.anchor !== inv.issuer || !(await C.diVerify(inv.credentialSubject.card, inv.issuer))) return { handled: true, error: 'card ownership' }\n const cardOK = !('sentTo' in inv.credentialSubject.card) && !('boundTo' in inv.credentialSubject.card) && !('deliveryHints' in inv.credentialSubject.card)\n if (!cardOK) return { handled: true, error: 'card enclosure profile' }\n if (![inv.validFrom, inv.validUntil, inv.proof.created].every(calOK) || tsec(inv.validUntil) < tsec(inv.validFrom)) return { handled: true, error: 'validity' }\n // THE PRELUDE CHECK (Membership 3.1): my own derivation from the\n // genesisDigest must equal credentialSubject.id — a substituted anchor\n // dies here, whatever the prelude's path was\n const my = await memberContext(p, inv.credentialSubject.genesisDigest)\n if (my.anchor !== inv.credentialSubject.id) { say(p, 'Prelude-Check FEHLGESCHLAGEN: Einladung nennt nicht meine Ableitung'); return { handled: true, error: 'prelude mismatch' } }\n const entry = { kind: 'invite', doc, invite: inv, from: from.name, fromAnchor: doc.issuer, fromContact: from, myMemberCtx: my, decided: false }\n p.inbox.push(entry)\n say(p, `${from.name} lädt dich in „${inv.credentialSubject.name ?? 'eine Gruppe'}\" ein (Einladung geprüft, Prelude-Check bestanden)`)\n return { handled: true, prompt: entry }\n}\n\n// ── the accept: consent, task-proved, credential-digest ref ─────────────\nexport async function acceptInvite (p: Person, entry: any, when: number, ent: any = {}) {\n const inv = entry.invite\n const iso = C.iso(when)\n const card = await memberCard(entry.myMemberCtx, p.name, iso)\n const payload = { accept: {\n group: inv.credentialSubject.group, subject: entry.myMemberCtx.anchor,\n ref: await C.digestDoc(inv), // the invitation identity: JCS over the COMPLETE credential incl. proof\n card, candidacy: ent.candidacy ?? false,\n } }\n validOr(payload, 'payload-membership-accept.schema.json')\n const body = {\n id: uuid(ent.docId), type: TT + 'membership-accept/0.2',\n issuer: entry.myMemberCtx.anchor, recipient: inv.issuer,\n threadId: inv.taskContext, issuedAt: iso, payload,\n }\n const doc = await C.diSign(entry.myMemberCtx, body, iso) // task proof under the subject (Membership 2)\n validOr(doc, 'rltp-delivery-document.schema.json')\n entry.decided = true; entry.accepted = true\n say(p, `Beitritt zu „${inv.credentialSubject.name}\" erklärt (Accept, ref = Credential-Digest)`)\n return sendDoc(p, entry.fromContact, doc, ent)\n}\n\n// ── admission: the Access 5.3 pair-internal checks, then roster + welcome ─\nasync function handleAccept (p: Person, doc: any, from: any, when: number, ent: any = {}) {\n const g = [...p.groups.values()].find((g) => g.threads.has(doc.issuer))\n if (!g) return { handled: true, error: 'no open invitation for this subject' }\n const th = g.threads.get(doc.issuer)\n const inv = th.invite, acc = doc.payload?.accept\n const fail = async (why: string) => { say(p, `Admission abgelehnt: ${why}`); return { handled: true, error: why } }\n try { validOr(doc.payload, 'payload-membership-accept.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(doc, doc.issuer))) return fail('accept task proof')\n if (!sameDigest(acc.ref, await C.digestDoc(inv))) return fail('ref ≠ credential digest') // decoded-bytes equality\n if (acc.subject !== inv.credentialSubject.id || acc.subject !== doc.issuer) return fail('subject binding')\n if (acc.group !== inv.credentialSubject.group || !sameDigest(inv.credentialSubject.genesisDigest, g.genesisDigest)) return fail('group binding')\n if (doc.threadId !== inv.taskContext) return fail('thread binding')\n if (acc.card.anchor !== acc.subject || !(await C.diVerify(acc.card, acc.subject))) return fail('card ownership')\n if (('sentTo' in acc.card) || ('boundTo' in acc.card) || ('deliveryHints' in acc.card)) return fail('card enclosure profile')\n if (![doc.issuedAt, doc.proof.created].every(calOK)) return fail('calendar validity')\n if (tsec(doc.issuedAt) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000 || tsec(doc.proof.created) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000) return fail('accept after validUntil + membership-skew')\n if (Buffer_(jcs(doc)) > 16384 || Buffer_(jcs({ invite: inv })) > 16384) return fail('size budget')\n if (!g.roster.has(inv.issuer)) return fail('inviter not a member')\n if (g.roster.has(acc.subject)) { say(p, 'Same-Subject-Admission: idempotent'); return { handled: true, idempotent: true } }\n // ATOMICITY (review 3, B-2): every await that can fail — digest,\n // signing, sealing — happens BEFORE the first state mutation. If the\n // welcome cannot be built, the roster has not grown, the thread still\n // stands, and the SAME delivery can be retried cleanly.\n const newEntry = { name: acc.card.name, card: acc.card, addedAt: C.iso(when), candidacy: acc.candidacy === true,\n acceptDigest: await C.digestDoc(doc), contactAnchor: th.contactAnchor }\n const contact = contactByAnchor(p, th.contactAnchor)\n const rosterAfter = [...g.roster.entries(), [acc.subject, newEntry] as const]\n const wBody = {\n id: uuid(), type: TT + 'membership-welcome@probe',\n issuer: g.myMemberCtx.anchor, recipient: acc.subject,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: g.genesisDigest, group: g.groupDid, label: g.label, genesis: g.genesis, vouchThreshold: g.vouchThreshold ?? 1,\n roster: rosterAfter.map(([anchor, m]: any) => ({ anchor, name: m.name, addedAt: m.addedAt, founder: !!m.founder, candidacy: !!m.candidacy, acceptDigest: m.acceptDigest ?? null })) },\n }\n const welcome = await sendDoc(p, contact, await C.diSign(g.myMemberCtx, wBody, C.iso(when)), ent)\n // — from here on, synchronous only —\n g.roster.set(acc.subject, newEntry)\n { const c = contactByAnchor(p, th.contactAnchor); if (c) (c.sharedGroups ??= []).push(g.genesisDigest) } // der Inviter WEISS, wer beigetreten ist\n g.threads.delete(doc.issuer)\n say(p, `${acc.card.name} ist Mitglied von „${g.label}\" — Admission kanonisch, Consent konsumiert`)\n return { handled: true, admitted: acc.subject, outbound: [welcome] }\n}\nconst Buffer_ = (s: any) => new TextEncoder().encode(s).length\n\nasync function handleWelcome (p: Person, doc: any, from: any) {\n // form BEFORE fields (M-3): the roster travels as data and becomes\n // this person's map — every entry earns its shape before adoption\n if (!C.shaped(doc, { issuer: 'string', recipient: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string', roster: 'array' })\n || !doc.payload.roster.every((m: any) => C.shaped(m, { anchor: 'string', name: 'string', addedAt: 'string' }))) return { handled: true, error: 'malformed welcome' }\n if (toU(doc.payload.genesisDigest) !== doc.payload.genesisDigest) return { handled: true, error: 'malformed welcome (genesisDigest)' }\n if (!(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'welcome proof' }\n const gd = doc.payload.genesisDigest\n let my\n try { my = await memberContext(p, gd) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n if (doc.recipient !== my.anchor) return { handled: true, error: 'welcome not for my member anchor' }\n const g: any = {\n label: doc.payload.label, groupDid: doc.payload.group, genesisDigest: gd,\n genesis: doc.payload.genesis, myMemberCtx: my, role: 'member',\n vouchThreshold: doc.payload.vouchThreshold ?? 1,\n vouchesReceived: new Map(), myVouches: new Map(),\n roster: new Map(doc.payload.roster.map((m: any) => [m.anchor, m])),\n threads: new Map(),\n }\n g.myAcceptDigest = g.roster.get(my.anchor)?.acceptDigest ?? null\n p.groups.set(gd, g)\n if (from) (from.sharedGroups ??= []).push(gd) // der Invitee WEISS, wer ihn eingeladen hat\n say(p, `Willkommen in „${g.label}\" — Roster mit ${g.roster.size} Mitgliedern übernommen`)\n return { handled: true, joined: gd }\n}\n\n// ── die Bürgschaft (Task membership-vouch/0.1, Artefakt vouch@2) ────────\n// ein konformes DTG EndorsementCredential ──────────────────────────────\n// (AdmissionVouch, Access 4.2/4.3): genesisDigest bindet die Gruppe,\n// accept bindet die KONSENTIERTE Kandidatur (keine stehende Bürgschaft),\n// provenance ist selbst-attestiert (met | introduced). Signiert unter dem\n// MEMBER-Anker des Bürgen; schema-validiert bei Ausstellung UND Empfang.\n// Transport (probe): über den Beziehungs-Kanal zum KANDIDATEN — nur wer\n// einen Kanal zum Kandidaten hält, kann liefern (per-device-Wissen,\n// nichts wird erfunden); der Kandidat sammelt und zählt gegen die\n// Schwelle. Gruppenweite Sichtbarkeit der Zählung = Access-Envelope-Ring.\nexport async function vouchFor (p: Person, genesisDigest: string, candidateAnchor: string, provenance: any, when: number, ent: any = {}) {\n const g = p.groups.get(genesisDigest)\n const m = g?.roster.get(candidateAnchor)\n if (!g || !m) return { error: 'unbekannter Kandidat' }\n if (!m.candidacy) return { error: 'keine sichtbare Kandidatur (Opt-in fehlt)' }\n if (!m.acceptDigest) return { error: 'kein accept-Bezug — Bürgschaft wäre stehend' }\n if (!m.contactAnchor || !p.contacts.get(m.contactAnchor)) return { error: 'kein Kanal zum Kandidaten' }\n if (g.myVouches.has(candidateAnchor)) return { error: 'bereits gebürgt' }\n const iso = C.iso(when)\n const cred = await C.diSign(g.myMemberCtx, {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'EndorsementCredential', 'AdmissionVouch'],\n issuer: g.myMemberCtx.anchor,\n validFrom: iso,\n credentialSubject: { id: candidateAnchor, endorsement: {\n type: 'AdmissionVouch', genesisDigest: toU(g.genesisDigest), accept: toU(m.acceptDigest), provenance } },\n }, iso)\n validOr(cred, 'access-vouch.schema.json')\n g.myVouches.set(candidateAnchor, cred)\n const contact = p.contacts.get(m.contactAnchor)\n const doc = {\n id: uuid(ent.docId), type: TT + 'membership-vouch/0.1',\n issuer: g.myMemberCtx.anchor, recipient: candidateAnchor,\n threadId: uuid(ent.threadId), issuedAt: iso, payload: { vouch: cred },\n }\n say(p, `Bürgschaft für ${m.name} in „${g.label}\" ausgestellt (${provenance}, accept-gebunden)`)\n return sendDoc(p, contact, await C.diSign(g.myMemberCtx, doc, iso), ent)\n}\n\n// Kandidatenseite: jede Prüfung an ihrem Punkt, dann zählen\nasync function handleVouch (p: Person, doc: any, from: any) {\n const cred = doc.payload?.vouch\n const g = [...p.groups.values()].find((g) => cred && sameDigest(cred.credentialSubject?.endorsement?.genesisDigest ?? '', g.genesisDigest))\n const fail = (why: string) => { say(p, `Bürgschaft verworfen: ${why}`); return { handled: true, error: why } }\n if (!g) return fail('unbekannte Gruppe')\n try { validOr(cred, 'access-vouch.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(cred, cred.issuer)) || !(await C.diVerify(doc, doc.issuer))) return fail('proof')\n if (cred.issuer !== doc.issuer) return fail('issuer binding')\n if (!g.roster.has(cred.issuer)) return fail('Bürge ist kein Mitglied')\n if (cred.credentialSubject.id !== g.myMemberCtx.anchor) return fail('nicht für mich')\n if (!g.myAcceptDigest || !sameDigest(cred.credentialSubject.endorsement.accept, g.myAcceptDigest)) return fail('accept-Bindung')\n if (g.vouchesReceived.has(cred.issuer)) { say(p, 'Bürgschaft doppelt — idempotent'); return { handled: true, idempotent: true } }\n g.vouchesReceived.set(cred.issuer, cred)\n const n = g.vouchesReceived.size, need = g.vouchThreshold ?? 1\n if (n >= need) {\n const me = g.roster.get(g.myMemberCtx.anchor)\n if (me) me.candidacy = false\n g.candidacyFulfilled = true\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} — Schwelle erreicht (${n}/${need}), Kandidatur erfüllt`)\n } else {\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} erhalten (${n}/${need})`)\n }\n return { handled: true, vouched: cred.issuer, fulfilled: n >= need }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"membership.js","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"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","sourcesContent":["// groups.mjs — Stage C: groups over the introduced channel. PROBE.\n// DOM-free, on rltp-core + rltp-crypto (+ the shipped schemas: the invite\n// IS the DTG InvitationCredential of membership-invite/0.2, the accept IS\n// membership-accept/0.2 — both schema-validated at issuance AND receipt).\n//\n// WHAT THIS PROBE EXERCISES (the converged Membership 0.16 / Access 0.30\n// semantics, instantiated live):\n// founding — the founder signs the genesis under a FOUNDING pair\n// context (Access 3.4.1: group/<digest> cannot exist\n// before the digest does); genesisDigest = multihash\n// over the proof-free genesis; the founder then derives\n// the member anchor group/<digest> and self-enrolls.\n// prelude — the inviter cannot derive the invitee's member anchor;\n// the invitee's app derives it from the genesisDigest\n// (canonical-u before the label, Access 5.1) and answers\n// over the EXISTING relationship channel (Membership 1.2).\n// invite — a conformant DTG InvitationCredential in a delivery\n// document WITHOUT a document proof (one carrier,\n// Membership 2); invitee re-derives and compares\n// (the prelude check, Membership 3.1).\n// accept — consent, task-proved under the subject; ref = the\n// CREDENTIAL digest (decoded-bytes equality).\n// admission — the inviter runs the Access 5.3 pair-internal checks\n// (path convention, time window incl. membership-skew,\n// size budget, card enclosure profile) and updates the\n// roster; a WELCOME (probe form) carries the roster to\n// members over their channels.\n// OUT OF PROBE SCOPE (named, not faked): the full access-operation\n// envelope (oid/prev/epochs), welcome seal + keydist/epoch keys, vouch\n// paths and candidacy surfacing, removal. That is the library's next\n// growth ring — the checks here are the real ones, the transport forms\n// marked @probe are not wire-normative.\nimport { jcs, makeValidator, toU, sameDigest, tsec, calOK } from '../core.js'\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { SCHEMAS } from '../schemas.js'\n\nconst V = makeValidator(SCHEMAS)\nconst validOr = (data: any, file: string) => { const s = SCHEMAS[file]; const errs = V.validate(data, s, s); if (errs.length) throw new Error(file + ': ' + errs[0]); return data }\nconst MEMBERSHIP_SKEW = 300 // PT5M (Membership §5)\nconst TT = 'https://real-life.org/trust-tasks/'\nconst CTX3 = ['https://www.w3.org/ns/credentials/v2', 'https://firstperson.network/credentials/dtg/v1', 'https://real-life.org/rltp/v1']\nconst say = (p: Person, m: string) => p.log.push(m)\nconst uuid = (ent?: any) => ent ?? globalThis.crypto.randomUUID()\n\n// member anchor: canonical-u re-encoding BEFORE the label (Access 5.1)\nexport async function memberContext (p: Person, genesisDigest: string) {\n const label = 'group/' + toU(genesisDigest)\n const ctx = await C.labeledContext(p.rootIkm, label)\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\nconst memberCard = async (ctx: any, name: string, whenIso: string) =>\n validOr(await C.signCard(ctx, C.cardBody(ctx, { name }), whenIso), 'contact-card.schema.json')\n\n// ── founding ────────────────────────────────────────────────────────────\nexport async function foundGroup (p: Person, label: string, when: number, ent: any = {}) {\n const iso = C.iso(when)\n const founding = await C.pairContext(p.rootIkm, ent.foundingNonce ?? C.rand(32)) // pair class: the founding occasion\n const groupDid = C.anchorOfEd((await C.edFromSeed(ent.groupSeed ?? C.rand(32))).pubRaw) // group address (probe mint; Identity work)\n const genesisBody = { type: 'group-genesis@probe', group: groupDid, label, founder: founding.anchor, issuedAt: iso }\n const genesis = await C.diSign(founding, genesisBody, iso)\n const genesisDigest = await C.digestDoc(genesisBody) // proof-free signature input (Access 3.2)\n const my = await memberContext(p, genesisDigest)\n const card = await memberCard(my, p.name, iso)\n const g: any = {\n label, groupDid, genesisDigest, genesis, myMemberCtx: my, role: 'founder',\n vouchThreshold: ent.vouchThreshold ?? 1, // Bürgschaftsschwelle (Gruppenregel; UI zeigt sie nur > 1)\n vouchesReceived: new Map(), // Bürgschaften FÜR MICH (issuer -> vouch@2)\n myVouches: new Map(), // Bürgschaften VON MIR (candidate -> vouch@2)\n roster: new Map([[my.anchor, { name: p.name, card, addedAt: iso, founder: true }]]),\n threads: new Map(), // invitee member anchor -> { threadId, invite } (open invitations)\n }\n p.groups.set(genesisDigest, g)\n say(p, `Gruppe „${label}\" gegründet — Genesis unter Gründungs-pair-Anker, Member-Anker ${my.anchor.slice(0, 20)}… abgeleitet`)\n return g\n}\n\n// ── transport helper: sealed doc over an existing relationship channel ──\nasync function sendDoc (p: Person, contact: any, doc: any, ent: any = {}) {\n return { to: contact, env: await C.seal(doc, contact.channel.counterpartKa, ent) }\n}\nconst channelCtxOf = (p: Person, doc: any) => p.contexts.get(doc.recipient) ?? null\nconst contactByAnchor = (p: Person, anchor: string) => p.contacts.get(anchor) ?? null\nconst contactOfIssuer = (p: Person, issuer: string) => p.contacts.get(issuer) ?? null\n\n// ── prelude (Membership 1.2/3.1: the invitee supplies the member anchor) ─\nexport async function preludeRequest (p: Person, contactAnchor: string, genesisDigest: string, when: number, ent: any = {}) {\n const contact = contactByAnchor(p, contactAnchor)\n const g = p.groups.get(genesisDigest)\n const body = {\n id: uuid(ent.id), type: TT + 'membership-prelude-request@probe',\n issuer: contact.channel.own.anchor, recipient: contactAnchor,\n threadId: uuid(ent.threadId), issuedAt: C.iso(when),\n payload: { genesisDigest, group: g.groupDid, label: g.label },\n }\n const doc = await C.diSign(contact.channel.own, body, C.iso(when))\n say(p, `Prelude an ${contact.name}: genesisDigest der Gruppe „${g.label}\" über den Beziehungs-Kanal`)\n return sendDoc(p, contact, doc, ent)\n}\n\n// ── receive dispatch: every membership doc travels the channel sealed ───\n// Returns { handled, outbound?: [{to, env}], prompt?: entry }.\nexport async function receiveDoc (p: Person, env: any, when: number, ent: any = {}) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { handled: true, duplicate: true }\n if (opened.error) return { handled: false }\n const r = await receiveDocInner(p, env, opened.doc, when, ent)\n if (r?.handled && !(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveDocInner (p: Person, env: any, doc: any, when: number, ent: any = {}) {\n const ctx = channelCtxOf(p, { recipient: env.rkid }) ?? p.contexts.get(env.rkid)\n if (!ctx) return { handled: false }\n if (typeof doc?.type !== 'string' || !doc.type.startsWith(TT + 'membership-')) return { handled: false, doc }\n // the sender is identified by the CHANNEL the envelope arrived on (rkid\n // names our own pair context of exactly one relationship) — membership\n // documents carry MEMBER anchors as issuer, which no contact key holds\n const from = [...p.contacts.values()].find((c) => c.channel?.own?.anchor === ctx.anchor) ?? contactOfIssuer(p, doc.issuer)\n switch (doc.type.slice((TT + 'membership-').length)) {\n case 'prelude-request@probe': {\n // form BEFORE fields (review 3, M-3): a valid signature binds\n // whatever was signed — payload.genesisDigest earns its type here\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string' })) return { handled: true, error: 'malformed prelude' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude proof' }\n let my\n try { my = await memberContext(p, doc.payload.genesisDigest) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n const body = {\n id: uuid(), type: TT + 'membership-prelude-reply@probe',\n issuer: from.channel.own.anchor, recipient: doc.issuer,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: doc.payload.genesisDigest, memberAnchor: my.anchor },\n }\n const reply = await C.diSign(from.channel.own, body, C.iso(when))\n say(p, `Prelude von ${from.name}: Member-Anker für „${doc.payload.label}\" abgeleitet und geantwortet`)\n return { handled: true, outbound: [await sendDoc(p, from, reply, ent)] }\n }\n case 'prelude-reply@probe': {\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', memberAnchor: 'string' })\n || C.edRawOfAnchor(doc.payload.memberAnchor) === null) return { handled: true, error: 'malformed prelude-reply' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude-reply proof' }\n const g = [...p.groups.values()].find((g) => g.genesisDigest === doc.payload.genesisDigest)\n if (!g) return { handled: true, error: 'unknown group' }\n // Log erst NACH dem gelungenen Bau; ein Schema-Throw aus\n // buildInvite verlässt die Empfangs-Promise nie (Review 9, P-B2)\n let inv\n try { inv = await buildInvite(p, g, from, doc.payload.memberAnchor, when, doc.threadId, ent) }\n catch (e: any) { return { handled: true, error: 'invite build: ' + String(e?.message ?? e) } }\n say(p, `${from.name}s Member-Anker erhalten — Einladung wird ausgestellt`)\n return { handled: true, outbound: [inv] }\n }\n case 'invite/0.2': return handleInvite(p, doc, from, when)\n case 'accept/0.2': return handleAccept(p, doc, from, when, ent)\n case 'welcome@probe': return handleWelcome(p, doc, from)\n case 'vouch/0.1': return handleVouch(p, doc, from)\n }\n return { handled: false, doc }\n}\n\n// ── the invite: a conformant DTG InvitationCredential (one carrier) ─────\nexport async function buildInvite (p: Person, g: any, contact: any, inviteeMemberAnchor: string, when: number, threadId: string, ent: any = {}) {\n const iso = C.iso(when), until = C.iso(when + 24 * 3600 * 1000)\n const inviterCard = await memberCard(g.myMemberCtx, p.name, iso)\n const credBody = {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'InvitationCredential', 'MembershipInvite'],\n issuer: g.myMemberCtx.anchor,\n credentialSubject: { id: inviteeMemberAnchor, group: g.groupDid, genesisDigest: g.genesisDigest, card: inviterCard, name: g.label },\n validFrom: iso, validUntil: until, taskContext: threadId,\n }\n const invite = await C.diSign(g.myMemberCtx, credBody, iso)\n validOr({ invite }, 'payload-membership-invite.schema.json')\n const doc = { // document-level proof ABSENT: the credential is the one carrier (Membership 2)\n id: uuid(ent.docId), type: TT + 'membership-invite/0.2',\n issuer: g.myMemberCtx.anchor, recipient: inviteeMemberAnchor,\n threadId, issuedAt: iso, payload: { invite },\n }\n validOr(doc, 'rltp-delivery-document.schema.json')\n g.threads.set(inviteeMemberAnchor, { threadId, invite, contactAnchor: [...p.contacts.entries()].find(([, c]) => c === contact)![0] })\n say(p, `Einladung (InvitationCredential) an ${contact.name} — Thread ${threadId.slice(0, 8)}…`)\n return sendDoc(p, contact, doc, ent)\n}\n\nasync function handleInvite (p: Person, doc: any, from: any, when: number) {\n if (!from) return { handled: true, error: 'invite not from a held contact' }\n const inv = doc.payload?.invite\n try { validOr(doc.payload, 'payload-membership-invite.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch (e: any) { say(p, 'Einladung schema-ungültig: ' + e.message); return { handled: true, error: 'schema' } }\n if ('proof' in doc) { say(p, 'Einladung trägt Dokument-Proof — one carrier verletzt'); return { handled: true, error: 'one-carrier' } }\n if (!(await C.diVerify(inv, inv.issuer))) return { handled: true, error: 'credential proof' }\n if (inv.issuer !== doc.issuer || inv.credentialSubject.id !== doc.recipient || inv.taskContext !== doc.threadId) return { handled: true, error: 'document bindings' }\n if (inv.credentialSubject.card.anchor !== inv.issuer || !(await C.diVerify(inv.credentialSubject.card, inv.issuer))) return { handled: true, error: 'card ownership' }\n const cardOK = !('sentTo' in inv.credentialSubject.card) && !('boundTo' in inv.credentialSubject.card) && !('deliveryHints' in inv.credentialSubject.card)\n if (!cardOK) return { handled: true, error: 'card enclosure profile' }\n if (![inv.validFrom, inv.validUntil, inv.proof.created].every(calOK) || tsec(inv.validUntil) < tsec(inv.validFrom)) return { handled: true, error: 'validity' }\n // THE PRELUDE CHECK (Membership 3.1): my own derivation from the\n // genesisDigest must equal credentialSubject.id — a substituted anchor\n // dies here, whatever the prelude's path was\n const my = await memberContext(p, inv.credentialSubject.genesisDigest)\n if (my.anchor !== inv.credentialSubject.id) { say(p, 'Prelude-Check FEHLGESCHLAGEN: Einladung nennt nicht meine Ableitung'); return { handled: true, error: 'prelude mismatch' } }\n const entry = { kind: 'invite', doc, invite: inv, from: from.name, fromAnchor: doc.issuer, fromContact: from, myMemberCtx: my, decided: false }\n p.inbox.push(entry)\n say(p, `${from.name} lädt dich in „${inv.credentialSubject.name ?? 'eine Gruppe'}\" ein (Einladung geprüft, Prelude-Check bestanden)`)\n return { handled: true, prompt: entry }\n}\n\n// ── the accept: consent, task-proved, credential-digest ref ─────────────\nexport async function acceptInvite (p: Person, entry: any, when: number, ent: any = {}) {\n const inv = entry.invite\n const iso = C.iso(when)\n const card = await memberCard(entry.myMemberCtx, p.name, iso)\n const payload = { accept: {\n group: inv.credentialSubject.group, subject: entry.myMemberCtx.anchor,\n ref: await C.digestDoc(inv), // the invitation identity: JCS over the COMPLETE credential incl. proof\n card, candidacy: ent.candidacy ?? false,\n } }\n validOr(payload, 'payload-membership-accept.schema.json')\n const body = {\n id: uuid(ent.docId), type: TT + 'membership-accept/0.2',\n issuer: entry.myMemberCtx.anchor, recipient: inv.issuer,\n threadId: inv.taskContext, issuedAt: iso, payload,\n }\n const doc = await C.diSign(entry.myMemberCtx, body, iso) // task proof under the subject (Membership 2)\n validOr(doc, 'rltp-delivery-document.schema.json')\n entry.decided = true; entry.accepted = true\n say(p, `Beitritt zu „${inv.credentialSubject.name}\" erklärt (Accept, ref = Credential-Digest)`)\n return sendDoc(p, entry.fromContact, doc, ent)\n}\n\n// ── admission: the Access 5.3 pair-internal checks, then roster + welcome ─\nasync function handleAccept (p: Person, doc: any, from: any, when: number, ent: any = {}) {\n const g = [...p.groups.values()].find((g) => g.threads.has(doc.issuer))\n if (!g) return { handled: true, error: 'no open invitation for this subject' }\n const th = g.threads.get(doc.issuer)\n const inv = th.invite, acc = doc.payload?.accept\n const fail = async (why: string) => { say(p, `Admission abgelehnt: ${why}`); return { handled: true, error: why } }\n try { validOr(doc.payload, 'payload-membership-accept.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(doc, doc.issuer))) return fail('accept task proof')\n if (!sameDigest(acc.ref, await C.digestDoc(inv))) return fail('ref ≠ credential digest') // decoded-bytes equality\n if (acc.subject !== inv.credentialSubject.id || acc.subject !== doc.issuer) return fail('subject binding')\n if (acc.group !== inv.credentialSubject.group || !sameDigest(inv.credentialSubject.genesisDigest, g.genesisDigest)) return fail('group binding')\n if (doc.threadId !== inv.taskContext) return fail('thread binding')\n if (acc.card.anchor !== acc.subject || !(await C.diVerify(acc.card, acc.subject))) return fail('card ownership')\n if (('sentTo' in acc.card) || ('boundTo' in acc.card) || ('deliveryHints' in acc.card)) return fail('card enclosure profile')\n if (![doc.issuedAt, doc.proof.created].every(calOK)) return fail('calendar validity')\n if (tsec(doc.issuedAt) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000 || tsec(doc.proof.created) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000) return fail('accept after validUntil + membership-skew')\n if (Buffer_(jcs(doc)) > 16384 || Buffer_(jcs({ invite: inv })) > 16384) return fail('size budget')\n if (!g.roster.has(inv.issuer)) return fail('inviter not a member')\n if (g.roster.has(acc.subject)) { say(p, 'Same-Subject-Admission: idempotent'); return { handled: true, idempotent: true } }\n // ATOMICITY (review 3, B-2): every await that can fail — digest,\n // signing, sealing — happens BEFORE the first state mutation. If the\n // welcome cannot be built, the roster has not grown, the thread still\n // stands, and the SAME delivery can be retried cleanly.\n const newEntry = { name: acc.card.name, card: acc.card, addedAt: C.iso(when), candidacy: acc.candidacy === true,\n acceptDigest: await C.digestDoc(doc), contactAnchor: th.contactAnchor }\n const contact = contactByAnchor(p, th.contactAnchor)\n const rosterAfter = [...g.roster.entries(), [acc.subject, newEntry] as const]\n const wBody = {\n id: uuid(), type: TT + 'membership-welcome@probe',\n issuer: g.myMemberCtx.anchor, recipient: acc.subject,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: g.genesisDigest, group: g.groupDid, label: g.label, genesis: g.genesis, vouchThreshold: g.vouchThreshold ?? 1,\n roster: rosterAfter.map(([anchor, m]: any) => ({ anchor, name: m.name, addedAt: m.addedAt, founder: !!m.founder, candidacy: !!m.candidacy, acceptDigest: m.acceptDigest ?? null })) },\n }\n const welcome = await sendDoc(p, contact, await C.diSign(g.myMemberCtx, wBody, C.iso(when)), ent)\n // — from here on, synchronous only —\n g.roster.set(acc.subject, newEntry)\n { const c = contactByAnchor(p, th.contactAnchor); if (c) (c.sharedGroups ??= []).push(g.genesisDigest) } // der Inviter WEISS, wer beigetreten ist\n g.threads.delete(doc.issuer)\n say(p, `${acc.card.name} ist Mitglied von „${g.label}\" — Admission kanonisch, Consent konsumiert`)\n return { handled: true, admitted: acc.subject, outbound: [welcome] }\n}\nconst Buffer_ = (s: any) => new TextEncoder().encode(s).length\n\nasync function handleWelcome (p: Person, doc: any, from: any) {\n // form BEFORE fields (M-3): the roster travels as data and becomes\n // this person's map — every entry earns its shape before adoption\n if (!C.shaped(doc, { issuer: 'string', recipient: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string', roster: 'array' })\n || !doc.payload.roster.every((m: any) => C.shaped(m, { anchor: 'string', name: 'string', addedAt: 'string' }))) return { handled: true, error: 'malformed welcome' }\n if (toU(doc.payload.genesisDigest) !== doc.payload.genesisDigest) return { handled: true, error: 'malformed welcome (genesisDigest)' }\n if (!(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'welcome proof' }\n const gd = doc.payload.genesisDigest\n let my\n try { my = await memberContext(p, gd) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n if (doc.recipient !== my.anchor) return { handled: true, error: 'welcome not for my member anchor' }\n // a held group is never rewritten by a later welcome\n if (p.groups.has(gd)) return { handled: true, idempotent: true }\n // the welcome answers an invitation THIS device accepted (Membership\n // Tasks: it travels in the invite's thread, from the inviter, for the\n // accept's subject and the invited group) — a signed welcome from a held\n // contact without that binding adopts nothing\n const entry = p.inbox.find((e: any) => e.kind === 'invite' && e.accepted && !e.welcomed\n && e.invite.taskContext === doc.threadId && e.invite.issuer === doc.issuer\n && e.myMemberCtx.anchor === doc.recipient\n && e.invite.credentialSubject.genesisDigest === gd && e.invite.credentialSubject.group === doc.payload.group)\n if (!entry) return { handled: true, error: 'welcome without an accepted invitation' }\n const listed = new Set(doc.payload.roster.map((m: any) => m.anchor))\n if (!listed.has(doc.issuer) || !listed.has(my.anchor)) return { handled: true, error: 'welcome roster omits its issuer or subject' }\n const g: any = {\n label: doc.payload.label, groupDid: doc.payload.group, genesisDigest: gd,\n genesis: doc.payload.genesis, myMemberCtx: my, role: 'member',\n vouchThreshold: doc.payload.vouchThreshold ?? 1,\n vouchesReceived: new Map(), myVouches: new Map(),\n roster: new Map(doc.payload.roster.map((m: any) => [m.anchor, m])),\n threads: new Map(),\n }\n g.myAcceptDigest = g.roster.get(my.anchor)?.acceptDigest ?? null\n p.groups.set(gd, g)\n entry.welcomed = true\n if (from) (from.sharedGroups ??= []).push(gd) // der Invitee WEISS, wer ihn eingeladen hat\n say(p, `Willkommen in „${g.label}\" — Roster mit ${g.roster.size} Mitgliedern übernommen`)\n return { handled: true, joined: gd }\n}\n\n// ── die Bürgschaft (Task membership-vouch/0.1, Artefakt vouch@2) ────────\n// ein konformes DTG EndorsementCredential ──────────────────────────────\n// (AdmissionVouch, Access 4.2/4.3): genesisDigest bindet die Gruppe,\n// accept bindet die KONSENTIERTE Kandidatur (keine stehende Bürgschaft),\n// provenance ist selbst-attestiert (met | introduced). Signiert unter dem\n// MEMBER-Anker des Bürgen; schema-validiert bei Ausstellung UND Empfang.\n// Transport (probe): über den Beziehungs-Kanal zum KANDIDATEN — nur wer\n// einen Kanal zum Kandidaten hält, kann liefern (per-device-Wissen,\n// nichts wird erfunden); der Kandidat sammelt und zählt gegen die\n// Schwelle. Gruppenweite Sichtbarkeit der Zählung = Access-Envelope-Ring.\nexport async function vouchFor (p: Person, genesisDigest: string, candidateAnchor: string, provenance: any, when: number, ent: any = {}) {\n const g = p.groups.get(genesisDigest)\n const m = g?.roster.get(candidateAnchor)\n if (!g || !m) return { error: 'unbekannter Kandidat' }\n if (!m.candidacy) return { error: 'keine sichtbare Kandidatur (Opt-in fehlt)' }\n if (!m.acceptDigest) return { error: 'kein accept-Bezug — Bürgschaft wäre stehend' }\n if (!m.contactAnchor || !p.contacts.get(m.contactAnchor)) return { error: 'kein Kanal zum Kandidaten' }\n if (g.myVouches.has(candidateAnchor)) return { error: 'bereits gebürgt' }\n const iso = C.iso(when)\n const cred = await C.diSign(g.myMemberCtx, {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'EndorsementCredential', 'AdmissionVouch'],\n issuer: g.myMemberCtx.anchor,\n validFrom: iso,\n credentialSubject: { id: candidateAnchor, endorsement: {\n type: 'AdmissionVouch', genesisDigest: toU(g.genesisDigest), accept: toU(m.acceptDigest), provenance } },\n }, iso)\n validOr(cred, 'access-vouch.schema.json')\n g.myVouches.set(candidateAnchor, cred)\n const contact = p.contacts.get(m.contactAnchor)\n const doc = {\n id: uuid(ent.docId), type: TT + 'membership-vouch/0.1',\n issuer: g.myMemberCtx.anchor, recipient: candidateAnchor,\n threadId: uuid(ent.threadId), issuedAt: iso, payload: { vouch: cred },\n }\n say(p, `Bürgschaft für ${m.name} in „${g.label}\" ausgestellt (${provenance}, accept-gebunden)`)\n return sendDoc(p, contact, await C.diSign(g.myMemberCtx, doc, iso), ent)\n}\n\n// Kandidatenseite: jede Prüfung an ihrem Punkt, dann zählen\nasync function handleVouch (p: Person, doc: any, from: any) {\n const cred = doc.payload?.vouch\n const g = [...p.groups.values()].find((g) => cred && sameDigest(cred.credentialSubject?.endorsement?.genesisDigest ?? '', g.genesisDigest))\n const fail = (why: string) => { say(p, `Bürgschaft verworfen: ${why}`); return { handled: true, error: why } }\n if (!g) return fail('unbekannte Gruppe')\n try { validOr(cred, 'access-vouch.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(cred, cred.issuer)) || !(await C.diVerify(doc, doc.issuer))) return fail('proof')\n if (cred.issuer !== doc.issuer) return fail('issuer binding')\n if (!g.roster.has(cred.issuer)) return fail('Bürge ist kein Mitglied')\n if (cred.credentialSubject.id !== g.myMemberCtx.anchor) return fail('nicht für mich')\n if (!g.myAcceptDigest || !sameDigest(cred.credentialSubject.endorsement.accept, g.myAcceptDigest)) return fail('accept-Bindung')\n if (g.vouchesReceived.has(cred.issuer)) { say(p, 'Bürgschaft doppelt — idempotent'); return { handled: true, idempotent: true } }\n g.vouchesReceived.set(cred.issuer, cred)\n const n = g.vouchesReceived.size, need = g.vouchThreshold ?? 1\n if (n >= need) {\n const me = g.roster.get(g.myMemberCtx.anchor)\n if (me) me.candidacy = false\n g.candidacyFulfilled = true\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} — Schwelle erreicht (${n}/${need}), Kandidatur erfüllt`)\n } else {\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} erhalten (${n}/${need})`)\n }\n return { handled: true, vouched: cred.issuer, fulfilled: n >= need }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@real-life/trust-protocol",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "The Real Life Trust Protocol (RLTP) \u2014 the executable form of the specification: encounters, introductions, trust disclosure, groups, continuity, and the delivery channel. Zero dependencies, WebCrypto only.",
|
|
5
5
|
"license": "CC-BY-4.0",
|
|
6
6
|
"type": "module",
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
],
|
|
50
50
|
"repository": {
|
|
51
51
|
"type": "git",
|
|
52
|
-
"url": "https://github.com/real-life-org/
|
|
52
|
+
"url": "https://github.com/real-life-org/trust-protocol",
|
|
53
|
+
"directory": "lib"
|
|
53
54
|
},
|
|
54
55
|
"homepage": "https://rltp.real-life.org",
|
|
55
56
|
"engines": {
|