diff --git a/lexicons-generated/rsvp/atmo/event/getRecord.json b/lexicons-generated/rsvp/atmo/event/getRecord.json index dace81f..d0343b2 100644 --- a/lexicons-generated/rsvp/atmo/event/getRecord.json +++ b/lexicons-generated/rsvp/atmo/event/getRecord.json @@ -23,7 +23,11 @@ "spaceUri": { "type": "string", "format": "at-uri", - "description": "If set, fetch from this permissioned space (requires service-auth JWT)." + "description": "If set, fetch from this permissioned space (requires service-auth JWT or a read-grant invite token)." + }, + "inviteToken": { + "type": "string", + "description": "Read-grant invite token for anonymous bearer access. Replaces JWT auth when supplied." }, "hydrateRsvps": { "type": "integer", diff --git a/lexicons-generated/rsvp/atmo/event/listRecords.json b/lexicons-generated/rsvp/atmo/event/listRecords.json index 582f31a..e0bba74 100644 --- a/lexicons-generated/rsvp/atmo/event/listRecords.json +++ b/lexicons-generated/rsvp/atmo/event/listRecords.json @@ -29,13 +29,17 @@ "spaceUri": { "type": "string", "format": "at-uri", - "description": "If set, query records inside this permissioned space (requires service-auth JWT)." + "description": "If set, query records inside this permissioned space (requires service-auth JWT or a read-grant invite token)." }, "byUser": { "type": "string", "format": "did", "description": "Only used with spaceUri — filter to records authored by this DID." }, + "inviteToken": { + "type": "string", + "description": "Read-grant invite token for anonymous bearer access. Replaces JWT auth when supplied." + }, "search": { "type": "string", "description": "Full-text search across: name, description" diff --git a/lexicons-generated/rsvp/atmo/permissionSet.json b/lexicons-generated/rsvp/atmo/permissionSet.json index 835c1ac..5e9aa5c 100644 --- a/lexicons-generated/rsvp/atmo/permissionSet.json +++ b/lexicons-generated/rsvp/atmo/permissionSet.json @@ -10,7 +10,7 @@ { "type": "permission", "resource": "rpc", - "inheritAud": true, + "aud": "*", "lxm": [ "rsvp.atmo.event.getRecord", "rsvp.atmo.event.listRecords", @@ -20,9 +20,8 @@ "rsvp.atmo.notifyOfUpdate", "rsvp.atmo.rsvp.getRecord", "rsvp.atmo.rsvp.listRecords", - "rsvp.atmo.space.admin.addMember", - "rsvp.atmo.space.admin.createSpace", - "rsvp.atmo.space.admin.removeMember", + "rsvp.atmo.space.addMember", + "rsvp.atmo.space.createSpace", "rsvp.atmo.space.deleteRecord", "rsvp.atmo.space.getRecord", "rsvp.atmo.space.getSpace", @@ -30,10 +29,14 @@ "rsvp.atmo.space.invite.list", "rsvp.atmo.space.invite.redeem", "rsvp.atmo.space.invite.revoke", + "rsvp.atmo.space.leaveSpace", "rsvp.atmo.space.listMembers", "rsvp.atmo.space.listRecords", "rsvp.atmo.space.listSpaces", - "rsvp.atmo.space.putRecord" + "rsvp.atmo.space.putRecord", + "rsvp.atmo.space.removeMember", + "rsvp.atmo.space.transferOwnership", + "rsvp.atmo.space.whoami" ] } ] diff --git a/lexicons-generated/rsvp/atmo/rsvp/getRecord.json b/lexicons-generated/rsvp/atmo/rsvp/getRecord.json index 80ebe7c..3d6c1c9 100644 --- a/lexicons-generated/rsvp/atmo/rsvp/getRecord.json +++ b/lexicons-generated/rsvp/atmo/rsvp/getRecord.json @@ -23,7 +23,11 @@ "spaceUri": { "type": "string", "format": "at-uri", - "description": "If set, fetch from this permissioned space (requires service-auth JWT)." + "description": "If set, fetch from this permissioned space (requires service-auth JWT or a read-grant invite token)." + }, + "inviteToken": { + "type": "string", + "description": "Read-grant invite token for anonymous bearer access. Replaces JWT auth when supplied." }, "hydrateEvent": { "type": "boolean", diff --git a/lexicons-generated/rsvp/atmo/rsvp/listRecords.json b/lexicons-generated/rsvp/atmo/rsvp/listRecords.json index df28722..fb3cb58 100644 --- a/lexicons-generated/rsvp/atmo/rsvp/listRecords.json +++ b/lexicons-generated/rsvp/atmo/rsvp/listRecords.json @@ -29,13 +29,17 @@ "spaceUri": { "type": "string", "format": "at-uri", - "description": "If set, query records inside this permissioned space (requires service-auth JWT)." + "description": "If set, query records inside this permissioned space (requires service-auth JWT or a read-grant invite token)." }, "byUser": { "type": "string", "format": "did", "description": "Only used with spaceUri — filter to records authored by this DID." }, + "inviteToken": { + "type": "string", + "description": "Read-grant invite token for anonymous bearer access. Replaces JWT auth when supplied." + }, "status": { "type": "string", "description": "Filter by status" diff --git a/lexicons-generated/rsvp/atmo/space/admin/addMember.json b/lexicons-generated/rsvp/atmo/space/addMember.json similarity index 96% rename from lexicons-generated/rsvp/atmo/space/admin/addMember.json rename to lexicons-generated/rsvp/atmo/space/addMember.json index 2ea9e75..3c69ac2 100644 --- a/lexicons-generated/rsvp/atmo/space/admin/addMember.json +++ b/lexicons-generated/rsvp/atmo/space/addMember.json @@ -1,6 +1,6 @@ { "lexicon": 1, - "id": "rsvp.atmo.space.admin.addMember", + "id": "rsvp.atmo.space.addMember", "defs": { "main": { "type": "procedure", diff --git a/lexicons-generated/rsvp/atmo/space/admin/createSpace.json b/lexicons-generated/rsvp/atmo/space/createSpace.json similarity index 97% rename from lexicons-generated/rsvp/atmo/space/admin/createSpace.json rename to lexicons-generated/rsvp/atmo/space/createSpace.json index 1ddedfc..f2d6dec 100644 --- a/lexicons-generated/rsvp/atmo/space/admin/createSpace.json +++ b/lexicons-generated/rsvp/atmo/space/createSpace.json @@ -1,6 +1,6 @@ { "lexicon": 1, - "id": "rsvp.atmo.space.admin.createSpace", + "id": "rsvp.atmo.space.createSpace", "defs": { "main": { "type": "procedure", diff --git a/lexicons-generated/rsvp/atmo/space/defs.json b/lexicons-generated/rsvp/atmo/space/defs.json index 788a843..1df906e 100644 --- a/lexicons-generated/rsvp/atmo/space/defs.json +++ b/lexicons-generated/rsvp/atmo/space/defs.json @@ -145,6 +145,7 @@ "required": [ "tokenHash", "spaceUri", + "kind", "perms", "usedCount", "createdBy", @@ -158,6 +159,14 @@ "type": "string", "format": "at-uri" }, + "kind": { + "type": "string", + "knownValues": [ + "join", + "read", + "read-join" + ] + }, "perms": { "type": "string", "knownValues": [ diff --git a/lexicons-generated/rsvp/atmo/space/getRecord.json b/lexicons-generated/rsvp/atmo/space/getRecord.json index 2b96fe4..68a9aeb 100644 --- a/lexicons-generated/rsvp/atmo/space/getRecord.json +++ b/lexicons-generated/rsvp/atmo/space/getRecord.json @@ -28,6 +28,10 @@ }, "rkey": { "type": "string" + }, + "inviteToken": { + "type": "string", + "description": "Read-grant invite token. When supplied, replaces JWT auth for this read." } } }, diff --git a/lexicons-generated/rsvp/atmo/space/getSpace.json b/lexicons-generated/rsvp/atmo/space/getSpace.json index 6bf9973..f89d15f 100644 --- a/lexicons-generated/rsvp/atmo/space/getSpace.json +++ b/lexicons-generated/rsvp/atmo/space/getSpace.json @@ -4,7 +4,7 @@ "defs": { "main": { "type": "query", - "description": "Get metadata for a single space. Caller must be a member or the owner.", + "description": "Get metadata for a single space. Caller must be a member, the owner, or hold a read-grant invite token.", "parameters": { "type": "params", "required": [ @@ -14,6 +14,10 @@ "uri": { "type": "string", "format": "at-uri" + }, + "inviteToken": { + "type": "string", + "description": "Read-grant invite token. When supplied, replaces JWT auth for this read." } } }, diff --git a/lexicons-generated/rsvp/atmo/space/invite/create.json b/lexicons-generated/rsvp/atmo/space/invite/create.json index 0131640..3eb9e8b 100644 --- a/lexicons-generated/rsvp/atmo/space/invite/create.json +++ b/lexicons-generated/rsvp/atmo/space/invite/create.json @@ -17,6 +17,16 @@ "type": "string", "format": "at-uri" }, + "kind": { + "type": "string", + "knownValues": [ + "join", + "read", + "read-join" + ], + "default": "join", + "description": "join: redeem to become a member. read: bearer-only read access, no membership. read-join: anonymous read + signed-in redeem to join." + }, "perms": { "type": "string", "knownValues": [ @@ -32,7 +42,7 @@ "maxUses": { "type": "integer", "minimum": 1, - "description": "Omit for unlimited uses." + "description": "Caps join redemptions only — read-token reads are unlimited. Omit for unlimited joins." }, "note": { "type": "string", diff --git a/lexicons-generated/rsvp/atmo/space/leaveSpace.json b/lexicons-generated/rsvp/atmo/space/leaveSpace.json new file mode 100644 index 0000000..f68fd30 --- /dev/null +++ b/lexicons-generated/rsvp/atmo/space/leaveSpace.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "rsvp.atmo.space.leaveSpace", + "defs": { + "main": { + "type": "procedure", + "description": "Remove the caller from a space's member list. The owner cannot leave — they must transferOwnership first.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "spaceUri" + ], + "properties": { + "spaceUri": { + "type": "string", + "format": "at-uri" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "ok" + ], + "properties": { + "ok": { + "type": "boolean" + } + } + } + }, + "errors": [ + { + "name": "NotFound" + }, + { + "name": "InvalidRequest", + "description": "Raised if the caller is the space owner." + } + ] + } + } +} diff --git a/lexicons-generated/rsvp/atmo/space/listRecords.json b/lexicons-generated/rsvp/atmo/space/listRecords.json index 3121b4a..664b580 100644 --- a/lexicons-generated/rsvp/atmo/space/listRecords.json +++ b/lexicons-generated/rsvp/atmo/space/listRecords.json @@ -33,6 +33,10 @@ "minimum": 1, "maximum": 200, "default": 50 + }, + "inviteToken": { + "type": "string", + "description": "Read-grant invite token. When supplied, replaces JWT auth for this read." } } }, diff --git a/lexicons-generated/rsvp/atmo/space/admin/removeMember.json b/lexicons-generated/rsvp/atmo/space/removeMember.json similarity index 95% rename from lexicons-generated/rsvp/atmo/space/admin/removeMember.json rename to lexicons-generated/rsvp/atmo/space/removeMember.json index 11d4893..9f0d03c 100644 --- a/lexicons-generated/rsvp/atmo/space/admin/removeMember.json +++ b/lexicons-generated/rsvp/atmo/space/removeMember.json @@ -1,6 +1,6 @@ { "lexicon": 1, - "id": "rsvp.atmo.space.admin.removeMember", + "id": "rsvp.atmo.space.removeMember", "defs": { "main": { "type": "procedure", diff --git a/lexicons-generated/rsvp/atmo/space/transferOwnership.json b/lexicons-generated/rsvp/atmo/space/transferOwnership.json new file mode 100644 index 0000000..6778445 --- /dev/null +++ b/lexicons-generated/rsvp/atmo/space/transferOwnership.json @@ -0,0 +1,57 @@ +{ + "lexicon": 1, + "id": "rsvp.atmo.space.transferOwnership", + "defs": { + "main": { + "type": "procedure", + "description": "Transfer space ownership to another DID. Caller must be the current owner. The new owner must already be a write member of the space. The previous owner becomes a regular write member.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "spaceUri", + "newOwnerDid" + ], + "properties": { + "spaceUri": { + "type": "string", + "format": "at-uri" + }, + "newOwnerDid": { + "type": "string", + "format": "did" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "space" + ], + "properties": { + "space": { + "type": "ref", + "ref": "rsvp.atmo.space.defs#spaceView" + } + } + } + }, + "errors": [ + { + "name": "NotFound" + }, + { + "name": "Forbidden" + }, + { + "name": "InvalidRequest", + "description": "Raised if the new owner is not a write member of the space." + } + ] + } + } +} diff --git a/lexicons-generated/rsvp/atmo/space/whoami.json b/lexicons-generated/rsvp/atmo/space/whoami.json new file mode 100644 index 0000000..e3737c7 --- /dev/null +++ b/lexicons-generated/rsvp/atmo/space/whoami.json @@ -0,0 +1,53 @@ +{ + "lexicon": 1, + "id": "rsvp.atmo.space.whoami", + "defs": { + "main": { + "type": "query", + "description": "Report the caller's relationship to a space: whether they are the owner, a member, and at what permission level. Useful for clients to avoid a listMembers roundtrip.", + "parameters": { + "type": "params", + "required": [ + "spaceUri" + ], + "properties": { + "spaceUri": { + "type": "string", + "format": "at-uri" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "isOwner", + "isMember" + ], + "properties": { + "isOwner": { + "type": "boolean" + }, + "isMember": { + "type": "boolean" + }, + "perms": { + "type": "string", + "knownValues": [ + "read", + "write" + ], + "description": "Present only when the caller is a member or the owner." + } + } + } + }, + "errors": [ + { + "name": "NotFound" + } + ] + } + } +}