@real-life/trust-protocol 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +99 -0
  2. package/dist/core.d.ts +32 -0
  3. package/dist/core.d.ts.map +1 -0
  4. package/dist/core.js +312 -0
  5. package/dist/core.js.map +1 -0
  6. package/dist/crypto.d.ts +32 -0
  7. package/dist/crypto.d.ts.map +1 -0
  8. package/dist/crypto.js +114 -0
  9. package/dist/crypto.js.map +1 -0
  10. package/dist/delivery.d.ts +51 -0
  11. package/dist/delivery.d.ts.map +1 -0
  12. package/dist/delivery.js +170 -0
  13. package/dist/delivery.js.map +1 -0
  14. package/dist/encounter.d.ts +63 -0
  15. package/dist/encounter.d.ts.map +1 -0
  16. package/dist/encounter.js +56 -0
  17. package/dist/encounter.js.map +1 -0
  18. package/dist/identity.d.ts +25 -0
  19. package/dist/identity.d.ts.map +1 -0
  20. package/dist/identity.js +87 -0
  21. package/dist/identity.js.map +1 -0
  22. package/dist/index.d.ts +6 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +29 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/probe/continuity.d.ts +99 -0
  27. package/dist/probe/continuity.d.ts.map +1 -0
  28. package/dist/probe/continuity.js +303 -0
  29. package/dist/probe/continuity.js.map +1 -0
  30. package/dist/probe/deps.d.ts +61 -0
  31. package/dist/probe/deps.d.ts.map +1 -0
  32. package/dist/probe/deps.js +54 -0
  33. package/dist/probe/deps.js.map +1 -0
  34. package/dist/probe/introduce.d.ts +70 -0
  35. package/dist/probe/introduce.d.ts.map +1 -0
  36. package/dist/probe/introduce.js +295 -0
  37. package/dist/probe/introduce.js.map +1 -0
  38. package/dist/probe/membership.d.ts +90 -0
  39. package/dist/probe/membership.d.ts.map +1 -0
  40. package/dist/probe/membership.js +450 -0
  41. package/dist/probe/membership.js.map +1 -0
  42. package/dist/probe/trust.d.ts +116 -0
  43. package/dist/probe/trust.d.ts.map +1 -0
  44. package/dist/probe/trust.js +345 -0
  45. package/dist/probe/trust.js.map +1 -0
  46. package/dist/probe.d.ts +8 -0
  47. package/dist/probe.d.ts.map +1 -0
  48. package/dist/probe.js +41 -0
  49. package/dist/probe.js.map +1 -0
  50. package/dist/schemas.d.ts +2 -0
  51. package/dist/schemas.d.ts.map +1 -0
  52. package/dist/schemas.js +51 -0
  53. package/dist/schemas.js.map +1 -0
  54. package/dist/unicode15.d.ts +8 -0
  55. package/dist/unicode15.d.ts.map +1 -0
  56. package/dist/unicode15.js +55 -0
  57. package/dist/unicode15.js.map +1 -0
  58. package/package.json +55 -0
@@ -0,0 +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"]}
@@ -0,0 +1,116 @@
1
+ import * as C from './deps.js';
2
+ import type { Person } from './deps.js';
3
+ export declare function hmac(keyBytes: Uint8Array, msg: string): Promise<string>;
4
+ export declare function communityContext(p: Person): Promise<C.Context>;
5
+ export declare const selfCard: (p: Person, whenIso: string) => Promise<C.CardBody & {
6
+ proof: Record<string, any>;
7
+ }>;
8
+ export declare function makeMapping(p: Person, counterpartAnchor: string, when: number): Promise<{
9
+ body: {
10
+ type: string;
11
+ pair: string;
12
+ self: string;
13
+ to: string;
14
+ issuedAt: string;
15
+ };
16
+ card: C.CardBody & {
17
+ proof: Record<string, any>;
18
+ };
19
+ mac1: string;
20
+ mac2: string;
21
+ }>;
22
+ export declare function verifyMapping(p: Person, m: any): Promise<boolean>;
23
+ export declare function forgeMapping(forger: Person, victimCard: any, pairAnchor: string, when: number): Promise<{
24
+ body: {
25
+ type: string;
26
+ pair: string;
27
+ self: string;
28
+ to: string;
29
+ issuedAt: string;
30
+ };
31
+ card: any;
32
+ mac1: string;
33
+ mac2: string;
34
+ }>;
35
+ export declare function buildStar(p: Person, contact: any): Promise<{
36
+ salt: string;
37
+ count: number;
38
+ blinded: string[];
39
+ }>;
40
+ export declare function starMatch(p: Person, entry: any, snap: any, anchor: string): Promise<any>;
41
+ export declare function refreshStarInfo(p: Person): Promise<void>;
42
+ export declare function setTrust(p: Person, counterpartAnchor: string, when: number, ent?: any): Promise<{
43
+ error: string;
44
+ to?: undefined;
45
+ env?: undefined;
46
+ } | {
47
+ to: any;
48
+ env: C.Envelope;
49
+ error?: undefined;
50
+ }>;
51
+ export declare function setTrustPaused(p: Person, counterpartAnchor: string, paused: boolean): void;
52
+ /**
53
+ * Refresh every deliverable star. Per-recipient resilience (review 5,
54
+ * M-1): a failure for ONE recipient never discards the stars already
55
+ * built for others — the result carries the sealed outbound plus a
56
+ * named failure list. THE CONTRACT: the caller (host application) owns
57
+ * redelivery of failed refreshes, e.g. by calling this again; a failed
58
+ * refresh is a SEND problem, never grounds to redeliver the inbound
59
+ * document (its effect is complete and cached).
60
+ */
61
+ export declare function starRefreshAll(p: Person, when: number, ent?: any): Promise<{
62
+ to: any;
63
+ env: C.Envelope;
64
+ }[] & {
65
+ failures: {
66
+ to: string;
67
+ error: string;
68
+ }[];
69
+ }>;
70
+ export declare function receiveTrustDoc(p: Person, env: any, when: number, ent?: any): Promise<{
71
+ handled: boolean;
72
+ doc: any;
73
+ error?: undefined;
74
+ disclosed?: undefined;
75
+ fromName?: undefined;
76
+ outbound?: undefined;
77
+ outboundError?: undefined;
78
+ star?: undefined;
79
+ } | {
80
+ handled: boolean;
81
+ error: string;
82
+ doc?: undefined;
83
+ disclosed?: undefined;
84
+ fromName?: undefined;
85
+ outbound?: undefined;
86
+ outboundError?: undefined;
87
+ star?: undefined;
88
+ } | {
89
+ handled: boolean;
90
+ disclosed: any;
91
+ fromName: any;
92
+ outbound: {
93
+ to: any;
94
+ env: C.Envelope;
95
+ }[];
96
+ outboundError: string | undefined;
97
+ doc?: undefined;
98
+ error?: undefined;
99
+ star?: undefined;
100
+ } | {
101
+ handled: boolean;
102
+ star: boolean;
103
+ doc?: undefined;
104
+ error?: undefined;
105
+ disclosed?: undefined;
106
+ fromName?: undefined;
107
+ outbound?: undefined;
108
+ outboundError?: undefined;
109
+ } | {
110
+ handled: boolean;
111
+ duplicate: boolean;
112
+ } | {
113
+ handled: boolean;
114
+ duplicate?: undefined;
115
+ }>;
116
+ //# sourceMappingURL=trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/probe/trust.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AASvC,wBAAsB,IAAI,CAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,mBAG5D;AAID,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,MAAM,sBAGhD;AACD,eAAO,MAAM,QAAQ,GAAU,GAAG,MAAM,EAAE,SAAS,MAAM;;EAGxD,CAAA;AAWD,wBAAsB,WAAW,CAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;GAWpF;AAGD,wBAAsB,aAAa,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,oBAerD;AAKD,wBAAsB,YAAY,CAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;GASpG;AAsCD,wBAAgB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;;;;GAOjD;AAED,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAGhF;AAGD,wBAAsB,eAAe,CAAE,CAAC,EAAE,MAAM,iBAY/C;AASD,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;;;GAoChG;AACD,wBAAgB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,QAKpF;AAID;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;YAEpD,MAAM;eAAS,MAAM;;GAqB5C;AAGD,wBAAsB,eAAe,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOtF"}
@@ -0,0 +1,345 @@
1
+ // trust.mjs — Stufe 2 des Redesigns: der EXPLIZITE VERTRAUENSAKT
2
+ // (aufgeschobene Anker-Offenlegung), der geblendete Stern und die
3
+ // Pause-Semantik. PROBE, DOM-frei, auf rltp-core + rltp-crypto.
4
+ //
5
+ // DAS MODELL (portiert aus graph-web.mjs auf den WebCrypto-Stack):
6
+ // Vertrauensakt = EINSEITIGE Offenlegungsentscheidung. A liefert an B:
7
+ // 1. das kreuz-MAC-te anchor-mapping pair→self (Designated Verifier:
8
+ // BEIDE MACs könnte auch B selbst berechnen — ein geleaktes
9
+ // Mapping beweist Dritten NICHTS; forgeMapping demonstriert das),
10
+ // 2. die eigene Self-Card (stabiler Anker + keyAgreement),
11
+ // 3. den geblendeten Stern-Schnappschuss.
12
+ // B VERIFIZIERT das Mapping mit den eigenen Geheimnissen, bevor die
13
+ // Verknüpfung akzeptiert wird. Pausieren stoppt nur KÜNFTIGE
14
+ // Lieferungen — Geliefertes bleibt (Einweg-Tür, irreversibles Wissen).
15
+ //
16
+ // Stern (Publikums-Prinzip, Klasse D): der Sender leitet NIE rohe
17
+ // Dritt-Anker weiter. Jeder gehaltene Self-Anker reist als
18
+ // HMAC(k, anchor) unter dem Beziehungs-Schlüssel k; der Empfänger kann
19
+ // nur Anker testen, die er selbst legitim hält („gemeinsame Kontakte"),
20
+ // und sonst nichts. Epochales Blenden: salt = monotone Sequenznummer
21
+ // pro Beziehung; Listen SORTIERT (Lieferreihenfolge leakt nichts).
22
+ // Ehrlicher Rest: 1-Bit-Orakel über gehaltene Anker + die Zählung.
23
+ import { jcs } from '../core.js';
24
+ import * as C from './deps.js';
25
+ const te = new TextEncoder();
26
+ const S = globalThis.crypto.subtle;
27
+ const TT = 'https://real-life.org/trust-tasks/';
28
+ const say = (p, m) => p.log.push(m);
29
+ const uuid = (ent) => ent ?? globalThis.crypto.randomUUID();
30
+ // ── Primitiven ──────────────────────────────────────────────────────────
31
+ export async function hmac(keyBytes, msg) {
32
+ const k = await S.importKey('raw', keyBytes, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
33
+ return C.b64uOf(new Uint8Array(await S.sign('HMAC', k, te.encode(msg))));
34
+ }
35
+ // der stabile soziale Anker = COMMUNITY-ANKER (Identity 0.13, S-DID-Schnitt):
36
+ // gewöhnlicher Gruppen-Kontext über die Genesis der persönlichen Community —
37
+ // nie mehr die zero-input-Recovery-Strings
38
+ export async function communityContext(p) {
39
+ if (!p.selfCtx)
40
+ p.selfCtx = await C.communityContext(p.rootIkm, p.communityGenesis);
41
+ return p.selfCtx;
42
+ }
43
+ export const selfCard = async (p, whenIso) => {
44
+ const s = await communityContext(p);
45
+ return C.signCard(s, C.cardBody(s, { name: p.name }), whenIso);
46
+ };
47
+ // Beziehungs-Schlüssel: X25519 zwischen den pair-Kontexten des Kanals
48
+ const chShared = (contact) => C.ecdh(contact.channel.own.x.priv, C.xRawOfMk(contact.channel.counterpartKa));
49
+ const relKey = async (contact, info) => C.hkdf(await chShared(contact), info);
50
+ // ── anchor-mapping@2 (Designated Verifier, Doppel-MAC) ──────────────────
51
+ // mac1: Kanal-DH (pairA × pairB) · mac2: selfA × pairB — der Empfänger
52
+ // rechnet mac2 mit SEINEM pair-Privkey gegen die Self-Card nach. Beide
53
+ // Schlüssel kann auch der Empfänger allein ableiten: Abstreitbarkeit.
54
+ const mappingBody = (pairAnchor, selfAnchor, toPairAnchor, whenIso) => ({ type: 'anchor-mapping@2', pair: pairAnchor, self: selfAnchor, to: toPairAnchor, issuedAt: whenIso });
55
+ export async function makeMapping(p, counterpartAnchor, when) {
56
+ const contact = p.contacts.get(counterpartAnchor);
57
+ const s = await communityContext(p);
58
+ const whenIso = C.iso(when);
59
+ const card = await selfCard(p, whenIso);
60
+ const body = mappingBody(contact.channel.own.anchor, s.anchor, counterpartAnchor, whenIso);
61
+ const msg = jcs(body);
62
+ const theirKa = C.xRawOfMk(contact.channel.counterpartKa);
63
+ return { body, card,
64
+ mac1: await hmac(await relKey(contact, 'rltp/trust/mac/map1'), msg),
65
+ mac2: await hmac(await C.hkdf(await C.ecdh(s.x.priv, theirKa), 'rltp/trust/mac/map2'), msg) };
66
+ }
67
+ // Verifikation ist EMPFÄNGER-PRIVAT: sie BRAUCHT die eigenen Geheimnisse
68
+ // (das ist der Punkt — ein Dritter kann nicht einmal die Gültigkeit prüfen)
69
+ export async function verifyMapping(p, m) {
70
+ try {
71
+ const b = m?.body;
72
+ if (!b || b.type !== 'anchor-mapping@2')
73
+ return false;
74
+ const entry = p.contacts.get(b.pair);
75
+ if (!entry?.channel?.own)
76
+ return false;
77
+ if (b.to !== entry.channel.own.anchor)
78
+ return false;
79
+ const card = m.card;
80
+ if (card?.anchor !== b.self || !(await C.diVerify(card, b.self)))
81
+ return false;
82
+ const msg = jcs(b);
83
+ if ((await hmac(await relKey(entry, 'rltp/trust/mac/map1'), msg)) !== m.mac1)
84
+ return false;
85
+ const k2 = await C.hkdf(await C.ecdh(entry.channel.own.x.priv, C.xRawOfMk(card.keyAgreement)), 'rltp/trust/mac/map2');
86
+ if ((await hmac(k2, msg)) !== m.mac2)
87
+ return false;
88
+ return true;
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ // die Abstreitbarkeits-Demo: der EMPFÄNGER fabriziert ein Mapping, das
95
+ // einen beliebigen pair-Anker an ein beliebiges Self bindet, dessen Card
96
+ // er hält — es verifiziert identisch. Genau darum überzeugt ein
97
+ // geleaktes Mapping niemanden.
98
+ export async function forgeMapping(forger, victimCard, pairAnchor, when) {
99
+ const entry = forger.contacts.get(pairAnchor);
100
+ const whenIso = C.iso(when);
101
+ const body = mappingBody(pairAnchor, victimCard.anchor, entry.channel.own.anchor, whenIso);
102
+ const msg = jcs(body);
103
+ const k2 = await C.hkdf(await C.ecdh(entry.channel.own.x.priv, C.xRawOfMk(victimCard.keyAgreement)), 'rltp/trust/mac/map2');
104
+ return { body, card: victimCard,
105
+ mac1: await hmac(await relKey(entry, 'rltp/trust/mac/map1'), msg),
106
+ mac2: await hmac(k2, msg) };
107
+ }
108
+ // ── der geblendete Stern ────────────────────────────────────────────────
109
+ // Sequenz-Reservierung: SYNCHRON vor jedem await, damit zwei
110
+ // nebenläufige Aufrufe nie denselben Salt ziehen (Review 6, B-1).
111
+ // Ein bei Fehlschlag verbrannter Salt ist erlaubt — die Sequenz ist
112
+ // strikt monoton, nicht lückenlos.
113
+ const reserveStarSeq = (contact) => {
114
+ contact.starSeqNext = Math.max(contact.starSeqNext ?? 0, contact.starSeq ?? 0) + 1;
115
+ return contact.starSeqNext;
116
+ };
117
+ const commitStar = (contact, seq, snap) => {
118
+ // das Journal hält NUR den High-Water-Stern: ein verspätet fertig
119
+ // gewordener kleinerer Salt rollt sentStar nicht zurück (Review 7, B-2)
120
+ if (seq > (contact.starSeq ?? 0)) {
121
+ contact.starSeq = seq;
122
+ contact.sentStar = snap;
123
+ }
124
+ };
125
+ // Produktion pro Kontakt SERIALISIERT: die Reservierung macht Salts
126
+ // eindeutig, erst die Kette macht ihre AUSLIEFERUNG streng steigend —
127
+ // der Empfänger verwirft normativ jeden nicht strikt größeren Salt
128
+ const withStarLock = (contact, fn) => {
129
+ const run = (contact.starLock ?? Promise.resolve()).then(fn, fn);
130
+ contact.starLock = run.catch(() => { });
131
+ return run;
132
+ };
133
+ // reine Berechnung — mutiert NICHTS; Sequenz kommt aus reserveStarSeq
134
+ async function buildStarPure(p, contact, seq) {
135
+ const salt = String(seq);
136
+ const k = await relKey(contact, 'rltp/trust/blind/star/' + salt);
137
+ const blinded = [];
138
+ let count = 0;
139
+ for (const e of p.contacts.values()) {
140
+ if (!e.selfAnchor)
141
+ continue;
142
+ count++;
143
+ blinded.push(await hmac(k, e.selfAnchor));
144
+ }
145
+ blinded.sort();
146
+ return { salt, count, blinded };
147
+ }
148
+ export function buildStar(p, contact) {
149
+ return withStarLock(contact, async () => {
150
+ const seq = reserveStarSeq(contact);
151
+ const snap = await buildStarPure(p, contact, seq);
152
+ commitStar(contact, seq, snap); // Sender-Journal: was ich hier zuletzt geliefert habe
153
+ return snap;
154
+ });
155
+ }
156
+ // Empfängerseite: denselben Lieferschlüssel nachrechnen, EINEN Anker testen
157
+ export async function starMatch(p, entry, snap, anchor) {
158
+ const k = await relKey(entry, 'rltp/trust/blind/star/' + snap.salt);
159
+ return snap.blinded.includes(await hmac(k, anchor));
160
+ }
161
+ // Cache für die synchrone UI: pro Kontakt { count, knownNames } aus dem
162
+ // empfangenen Schnappschuss gegen die EIGENEN gehaltenen Self-Anker.
163
+ export async function refreshStarInfo(p) {
164
+ for (const [key, entry] of p.contacts) {
165
+ if (!entry.starReceived || !entry.channel?.own)
166
+ continue;
167
+ const known = [];
168
+ const seen = new Set();
169
+ for (const [k2, e] of p.contacts) {
170
+ if (k2 === key || !e.selfAnchor || seen.has(e.selfAnchor))
171
+ continue;
172
+ seen.add(e.selfAnchor);
173
+ if (await starMatch(p, entry, entry.starReceived, e.selfAnchor))
174
+ known.push(e.name);
175
+ }
176
+ entry.starInfo = { count: entry.starReceived.count, knownNames: known.sort() };
177
+ }
178
+ }
179
+ // ── der Vertrauensakt ───────────────────────────────────────────────────
180
+ // Erlaubt für ✓ (Zeremonie) UND ⇄ (vorgestellt, beidseitig) — Vertrauen
181
+ // ist eine OFFENLEGUNGS-Entscheidung, keine Verifikations-Behauptung
182
+ // (Antons Entscheid 24.08.); die UI benennt bei ⇄ ehrlich die
183
+ // Vermittler-Abhängigkeit. Gesperrt bleibt ◇: einseitig hast du nichts
184
+ // freigegeben — es existiert kein eigener Kanal-Kontext für das Mapping.
185
+ // Einweg-Tür: trustGiven bleibt; Pausieren stoppt nur das Abo.
186
+ export async function setTrust(p, counterpartAnchor, when, ent = {}) {
187
+ const contact = p.contacts.get(counterpartAnchor);
188
+ if (!contact)
189
+ return { error: 'kein Kontakt' };
190
+ if (!contact.channel?.own)
191
+ return { error: 'kein eigener Kanal — einseitig (◇) hast du nichts freigegeben' };
192
+ if (contact.trustGiven)
193
+ return { error: 'bereits geschenkt (Einweg-Tür)' };
194
+ // In-flight-Latch (Review 6, B-1): der Latch fällt SYNCHRON — zwei
195
+ // nebenläufige Aufrufe können die offene Tür nicht beide bestehen
196
+ if (contact.trustPending)
197
+ return { error: 'bereits unterwegs (Einweg-Tür)' };
198
+ contact.trustPending = true;
199
+ try {
200
+ // ALLES Fehlbare — auch die Zeitform (when=NaN wirft) — liegt im
201
+ // try, dessen finally den Latch räumt (Review 7, B-1)
202
+ const whenIso = C.iso(when);
203
+ // die Tür schließt erst, wenn die Disclosure WIRKLICH existiert
204
+ // (Review 5, B-5): alles Fehlbare läuft vor den Journal-Mutationen
205
+ const mapping = await makeMapping(p, counterpartAnchor, when);
206
+ // Stern-Abschnitt unter dem Kontakt-Lock: Reservierung, Bau, Siegel
207
+ // und Commit in EINEM geordneten Zug (Review 7, B-2)
208
+ const { env, star, seq } = await withStarLock(contact, async () => {
209
+ const seq = reserveStarSeq(contact);
210
+ const star = await buildStarPure(p, contact, seq);
211
+ const body = {
212
+ id: uuid(ent.id), type: TT + 'trust-disclosure@probe',
213
+ issuer: contact.channel.own.anchor, recipient: counterpartAnchor,
214
+ issuedAt: whenIso, payload: { mapping, star },
215
+ };
216
+ const doc = await C.diSign(contact.channel.own, body, whenIso);
217
+ const env = await C.seal(doc, contact.channel.counterpartKa, ent);
218
+ commitStar(contact, seq, star);
219
+ return { env, star, seq };
220
+ });
221
+ contact.trustGiven = whenIso;
222
+ contact.sentMapping = mapping; // Sender-Journal: die geöffnete Einweg-Tür
223
+ say(p, `Vertrauen geschenkt an ${contact.name}: stabiler Anker offengelegt (DV-Mapping) + Kontakt-Updates aktiv`);
224
+ return { to: contact, env };
225
+ }
226
+ finally {
227
+ contact.trustPending = false;
228
+ }
229
+ }
230
+ export function setTrustPaused(p, counterpartAnchor, paused) {
231
+ const contact = p.contacts.get(counterpartAnchor);
232
+ if (!contact?.trustGiven)
233
+ return;
234
+ contact.trustPaused = !!paused;
235
+ say(p, paused ? `Kontakt-Updates an ${contact.name} pausiert (Geliefertes bleibt)` : `Kontakt-Updates an ${contact.name} wieder aktiv`);
236
+ }
237
+ // Bestand geändert (neuer Self-Anker gehalten) → Stern überall auffrischen,
238
+ // wo ich vertraue und nicht pausiert habe. Ohne das frieren Sterne in der
239
+ // Toggle-Reihenfolge ein (Antons Erstlauf-Befund im Graph-Simulator).
240
+ /**
241
+ * Refresh every deliverable star. Per-recipient resilience (review 5,
242
+ * M-1): a failure for ONE recipient never discards the stars already
243
+ * built for others — the result carries the sealed outbound plus a
244
+ * named failure list. THE CONTRACT: the caller (host application) owns
245
+ * redelivery of failed refreshes, e.g. by calling this again; a failed
246
+ * refresh is a SEND problem, never grounds to redeliver the inbound
247
+ * document (its effect is complete and cached).
248
+ */
249
+ export async function starRefreshAll(p, when, ent = {}) {
250
+ const outbound = [];
251
+ const failures = [];
252
+ for (const [anchor, contact] of p.contacts) {
253
+ if (!contact.trustGiven || contact.trustPaused)
254
+ continue;
255
+ try {
256
+ const env = await withStarLock(contact, async () => {
257
+ const seq = reserveStarSeq(contact);
258
+ const star = await buildStarPure(p, contact, seq);
259
+ const whenIso = C.iso(when);
260
+ const body = {
261
+ id: uuid(), type: TT + 'trust-star@probe',
262
+ issuer: contact.channel.own.anchor, recipient: anchor,
263
+ issuedAt: whenIso, payload: { star },
264
+ };
265
+ const sealed = await C.seal(await C.diSign(contact.channel.own, body, whenIso), contact.channel.counterpartKa, ent);
266
+ commitStar(contact, seq, star);
267
+ return sealed;
268
+ });
269
+ outbound.push({ to: contact, env });
270
+ }
271
+ catch (e) {
272
+ failures.push({ to: contact.name ?? anchor, error: String(e?.message ?? e) });
273
+ }
274
+ }
275
+ return Object.assign(outbound, { failures });
276
+ }
277
+ // ── Empfangs-Dispatch (Form wie groups.receiveDoc) ──────────────────────
278
+ export async function receiveTrustDoc(p, env, when, ent = {}) {
279
+ const opened = await C.openEnvelope(p, env); // Stufen 1–4, Cache-Lesung
280
+ if (opened.duplicate)
281
+ return { handled: true, duplicate: true };
282
+ if (opened.error)
283
+ return { handled: false };
284
+ const r = await receiveTrustDocInner(p, env, opened.doc, when, ent);
285
+ if (r?.handled && !r.error)
286
+ C.effectDone(p, opened.digest);
287
+ return r;
288
+ }
289
+ async function receiveTrustDocInner(p, env, doc, when, ent = {}) {
290
+ const ctx = p.contexts.get(env.rkid);
291
+ if (!ctx)
292
+ return { handled: false };
293
+ if (typeof doc?.type !== 'string' || !doc.type.startsWith(TT + 'trust-'))
294
+ return { handled: false, doc };
295
+ // form BEFORE fields (M-3): issuer, proof and payload as used below
296
+ // form BEFORE fields (M-3, verschärft in Runde 3): jeder Typ verlangt
297
+ // SEIN Payload — star@probe ohne star ist formwidrig, nicht ein Throw
298
+ const kind = doc.type.slice((TT + 'trust-').length);
299
+ const starOk = C.shaped(doc.payload ?? {}, { star: 'object' }) && C.shaped(doc.payload.star, { salt: 'string', count: 'number', blinded: 'array' })
300
+ && C.intStr(doc.payload.star.salt) && Number.isInteger(doc.payload.star.count) && doc.payload.star.count >= 0
301
+ && doc.payload.star.count === doc.payload.star.blinded.length
302
+ && doc.payload.star.blinded.every((b) => typeof b === 'string');
303
+ const mappingOk = C.shaped(doc.payload ?? {}, { mapping: 'object' }) && C.shaped(doc.payload.mapping, { mac1: 'string', mac2: 'string', card: 'object' });
304
+ if (!C.shaped(doc, { issuer: 'string', proof: 'object', payload: 'object' })
305
+ || (kind === 'disclosure@probe' && !(mappingOk && starOk))
306
+ || (kind === 'star@probe' && !starOk))
307
+ return { handled: true, error: 'malformed' };
308
+ const fromEntry = [...p.contacts.entries()].find(([, c]) => c.channel?.own?.anchor === ctx.anchor);
309
+ if (!fromEntry)
310
+ return { handled: true, error: 'kein Kanal' };
311
+ const [fromKey, from] = fromEntry;
312
+ if (doc.issuer !== fromKey || !(await C.diVerify(doc, doc.issuer)))
313
+ return { handled: true, error: 'trust doc proof' };
314
+ switch (doc.type.slice((TT + 'trust-').length)) {
315
+ case 'disclosure@probe': {
316
+ const m = doc.payload?.mapping;
317
+ if (!(await verifyMapping(p, m))) {
318
+ say(p, `Mapping von ${from.name} verifiziert NICHT — verworfen`);
319
+ return { handled: true, error: 'mapping' };
320
+ }
321
+ from.selfAnchor = m.body.self;
322
+ from.mapping = m;
323
+ from.trustReceived = doc.issuedAt;
324
+ from.starReceived = doc.payload.star;
325
+ await refreshStarInfo(p);
326
+ say(p, `${from.name} vertraut dir: stabiler Anker geprüft übernommen (nur für dich beweisend)`);
327
+ // mein Bestand wuchs → mein lieferbarer Stern auch: auffrischen.
328
+ // Der INBOUND-Effekt ist hier komplett und bleibt cached;
329
+ // starRefreshAll ist pro Empfänger resilient — Teilergebnisse
330
+ // gehen nie verloren, Fehlschläge stehen benannt in failures und
331
+ // gehören dem HOST (Nachliefer-Vertrag, Review 5 M-1)
332
+ const outbound = await starRefreshAll(p, when, ent);
333
+ const outboundError = outbound.failures.length ? outbound.failures.map((f) => `${f.to}: ${f.error}`).join(' · ') : undefined;
334
+ return { handled: true, disclosed: m.body.self, fromName: from.name, outbound: [...outbound], outboundError };
335
+ }
336
+ case 'star@probe': {
337
+ from.starReceived = doc.payload.star;
338
+ await refreshStarInfo(p);
339
+ say(p, `Kontakt-Update von ${from.name}: ${doc.payload.star.count} Kontakte (geblendet)`);
340
+ return { handled: true, star: true };
341
+ }
342
+ }
343
+ return { handled: false, doc };
344
+ }
345
+ //# sourceMappingURL=trust.js.map