From d30e95b2ce1ffe9dc4655855406f2784b5f7af34 Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Wed, 23 Sep 2026 17:31:06 +0200 Subject: feat(node): invitation links — a code bound to no account until redeemed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New invite kind "link": member of one group, once, never operator, not spendable by an active member, capped at 20 per group, cancellable by handle. Signed ops invite_link_create / invite_cancel, loopback routes, and the known-device join path now accepts a link code. Adds the plan, docs/invite-links.md. Co-Authored-By: Claude Opus 5.5 --- packages/meshbay-common/src/meshbay_common/adminop.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'packages/meshbay-common/src/meshbay_common/adminop.py') diff --git a/packages/meshbay-common/src/meshbay_common/adminop.py b/packages/meshbay-common/src/meshbay_common/adminop.py index 20b5080..23040be 100644 --- a/packages/meshbay-common/src/meshbay_common/adminop.py +++ b/packages/meshbay-common/src/meshbay_common/adminop.py @@ -36,6 +36,13 @@ ADMIN_TRANSCRIPT_PREFIX = b"meshbay:admin:v1" OP_FILE_DELETE = "file_delete" OP_DIR_DELETE = "dir_delete" OP_INVITE_CREATE = "invite_create" +# An invitation bound to no account (docs/invite-links.md). Its own op rather +# than `invite_create` with an empty subject: that subject is the invitee, and +# what the operator is shown before signing has to name the outcome (H5) — here +# "a link into this group", `link:`. +OP_INVITE_LINK_CREATE = "invite_link_create" +# Taking back an unredeemed link, by the handle it was issued with. +OP_INVITE_CANCEL = "invite_cancel" OP_MEMBER_REVOKE = "member_revoke" # Rotating the group key is what actually takes it away from a revoked member: # revocation stops the node serving the *next* key, and they still hold the -- cgit v1.2.3