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-node/src/meshbay_node/ui/app.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'packages/meshbay-node/src/meshbay_node/ui/app.py') diff --git a/packages/meshbay-node/src/meshbay_node/ui/app.py b/packages/meshbay-node/src/meshbay_node/ui/app.py index 888487c..f6b93ea 100644 --- a/packages/meshbay-node/src/meshbay_node/ui/app.py +++ b/packages/meshbay-node/src/meshbay_node/ui/app.py @@ -322,6 +322,14 @@ def create_ui_app(state: dict) -> FastAPI: async def create_invite(group_id: str, username: str): return await _op(lambda: ops.create_invite(state, group_id, username)) + @app.post("/api/groups/{group_id}/invite-links") + async def create_link_invite(group_id: str): + return await _op(lambda: ops.create_link_invite(state, group_id)) + + @app.delete("/api/groups/{group_id}/invite-links/{invite_id}") + async def cancel_invite(group_id: str, invite_id: str): + return await _op(lambda: ops.cancel_invite(state, group_id, invite_id)) + @app.get("/api/resolve") async def resolve_user(username: str): return await _op(lambda: ops.resolve_user(state, username)) -- cgit v1.2.3