···3030optionally if you want all current events to be displayed run this: (will take a few minutes)
31313232```
3333-pnpm run sync
3333+pnpm backfill
3434```
35353636start dev server:
···44 "defs": {
55 "main": {
66 "type": "query",
77- "description": "List spaces the caller has access to. Default scope is 'member' (spaces the caller is a member of, including owned); 'owner' lists only spaces the caller owns.",
77+ "description": "List spaces the caller has access to. Default scope is 'member' (spaces the caller is a member of, including owned); 'owner' lists only spaces the caller owns. When scope='member', the optional 'owner' param narrows to spaces owned by that DID — useful for listing all channels in a specific community the caller can access.",
88 "parameters": {
99 "type": "params",
1010 "properties": {
···1919 "type": {
2020 "type": "string",
2121 "format": "nsid"
2222+ },
2323+ "owner": {
2424+ "type": "string",
2525+ "format": "did",
2626+ "description": "With scope=member, filter to spaces owned by this DID. Ignored when scope=owner."
2227 },
2328 "cursor": {
2429 "type": "string"
···11+// Auto-generated by @atmo-dev/contrail-lexicons. Do not edit.
22+// Pass `lexicons` to `createWorker(config, { lexicons })` to expose them
33+// at `/xrpc/<namespace>.lexicons` for consumer apps to typegen against.
44+55+import _0 from "../pulled/app/bsky/actor/profile.json";
66+import _1 from "../pulled/community/lexicon/calendar/event.json";
77+import _2 from "../pulled/community/lexicon/calendar/rsvp.json";
88+import _3 from "../pulled/community/lexicon/location/address.json";
99+import _4 from "../pulled/community/lexicon/location/fsq.json";
1010+import _5 from "../pulled/community/lexicon/location/geo.json";
1111+import _6 from "../pulled/community/lexicon/location/hthree.json";
1212+import _7 from "./rsvp/atmo/authFull.json";
1313+import _8 from "./rsvp/atmo/event/getRecord.json";
1414+import _9 from "./rsvp/atmo/event/listRecords.json";
1515+import _10 from "./rsvp/atmo/getCursor.json";
1616+import _11 from "./rsvp/atmo/getOverview.json";
1717+import _12 from "./rsvp/atmo/getProfile.json";
1818+import _13 from "./rsvp/atmo/invite/create.json";
1919+import _14 from "./rsvp/atmo/invite/defs.json";
2020+import _15 from "./rsvp/atmo/invite/list.json";
2121+import _16 from "./rsvp/atmo/invite/redeem.json";
2222+import _17 from "./rsvp/atmo/invite/revoke.json";
2323+import _18 from "./rsvp/atmo/notifyOfUpdate.json";
2424+import _19 from "./rsvp/atmo/rsvp/getRecord.json";
2525+import _20 from "./rsvp/atmo/rsvp/listRecords.json";
2626+import _21 from "./rsvp/atmo/space/addMember.json";
2727+import _22 from "./rsvp/atmo/space/createSpace.json";
2828+import _23 from "./rsvp/atmo/space/defs.json";
2929+import _24 from "./rsvp/atmo/space/deleteRecord.json";
3030+import _25 from "./rsvp/atmo/space/getBlob.json";
3131+import _26 from "./rsvp/atmo/space/getRecord.json";
3232+import _27 from "./rsvp/atmo/space/getSpace.json";
3333+import _28 from "./rsvp/atmo/space/leaveSpace.json";
3434+import _29 from "./rsvp/atmo/space/listBlobs.json";
3535+import _30 from "./rsvp/atmo/space/listMembers.json";
3636+import _31 from "./rsvp/atmo/space/listRecords.json";
3737+import _32 from "./rsvp/atmo/space/listSpaces.json";
3838+import _33 from "./rsvp/atmo/space/putRecord.json";
3939+import _34 from "./rsvp/atmo/space/removeMember.json";
4040+import _35 from "./rsvp/atmo/space/uploadBlob.json";
4141+import _36 from "./rsvp/atmo/spaceExt/whoami.json";
4242+4343+export const lexicons: object[] = [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36];
···1010export * as RsvpAtmoGetCursor from "./types/rsvp/atmo/getCursor.js";
1111export * as RsvpAtmoGetOverview from "./types/rsvp/atmo/getOverview.js";
1212export * as RsvpAtmoGetProfile from "./types/rsvp/atmo/getProfile.js";
1313+export * as RsvpAtmoInviteCreate from "./types/rsvp/atmo/invite/create.js";
1414+export * as RsvpAtmoInviteDefs from "./types/rsvp/atmo/invite/defs.js";
1515+export * as RsvpAtmoInviteList from "./types/rsvp/atmo/invite/list.js";
1616+export * as RsvpAtmoInviteRedeem from "./types/rsvp/atmo/invite/redeem.js";
1717+export * as RsvpAtmoInviteRevoke from "./types/rsvp/atmo/invite/revoke.js";
1318export * as RsvpAtmoNotifyOfUpdate from "./types/rsvp/atmo/notifyOfUpdate.js";
1419export * as RsvpAtmoRsvpGetRecord from "./types/rsvp/atmo/rsvp/getRecord.js";
1520export * as RsvpAtmoRsvpListRecords from "./types/rsvp/atmo/rsvp/listRecords.js";
···1722export * as RsvpAtmoSpaceCreateSpace from "./types/rsvp/atmo/space/createSpace.js";
1823export * as RsvpAtmoSpaceDefs from "./types/rsvp/atmo/space/defs.js";
1924export * as RsvpAtmoSpaceDeleteRecord from "./types/rsvp/atmo/space/deleteRecord.js";
2525+export * as RsvpAtmoSpaceGetBlob from "./types/rsvp/atmo/space/getBlob.js";
2026export * as RsvpAtmoSpaceGetRecord from "./types/rsvp/atmo/space/getRecord.js";
2127export * as RsvpAtmoSpaceGetSpace from "./types/rsvp/atmo/space/getSpace.js";
2222-export * as RsvpAtmoSpaceInviteCreate from "./types/rsvp/atmo/space/invite/create.js";
2323-export * as RsvpAtmoSpaceInviteList from "./types/rsvp/atmo/space/invite/list.js";
2424-export * as RsvpAtmoSpaceInviteRedeem from "./types/rsvp/atmo/space/invite/redeem.js";
2525-export * as RsvpAtmoSpaceInviteRevoke from "./types/rsvp/atmo/space/invite/revoke.js";
2628export * as RsvpAtmoSpaceLeaveSpace from "./types/rsvp/atmo/space/leaveSpace.js";
2929+export * as RsvpAtmoSpaceListBlobs from "./types/rsvp/atmo/space/listBlobs.js";
2730export * as RsvpAtmoSpaceListMembers from "./types/rsvp/atmo/space/listMembers.js";
2831export * as RsvpAtmoSpaceListRecords from "./types/rsvp/atmo/space/listRecords.js";
2932export * as RsvpAtmoSpaceListSpaces from "./types/rsvp/atmo/space/listSpaces.js";
3033export * as RsvpAtmoSpacePutRecord from "./types/rsvp/atmo/space/putRecord.js";
3134export * as RsvpAtmoSpaceRemoveMember from "./types/rsvp/atmo/space/removeMember.js";
3232-export * as RsvpAtmoSpaceWhoami from "./types/rsvp/atmo/space/whoami.js";
3535+export * as RsvpAtmoSpaceUploadBlob from "./types/rsvp/atmo/space/uploadBlob.js";
3636+export * as RsvpAtmoSpaceExtWhoami from "./types/rsvp/atmo/spaceExt/whoami.js";
···11import type { ContrailConfig } from '@atmo-dev/contrail';
22-import { SPACE_TYPE } from '../spaces/config';
22+import { SPACE_TYPE } from './spaces/config';
3344export const config: ContrailConfig = {
55 namespace: 'rsvp.atmo',
···6161 collection: 'community.lexicon.calendar.rsvp',
6262 queryable: {
6363 status: {},
6464- 'subject.uri': {}
6464+ 'subject.uri': {},
6565+ // Sortable so the home-page activity feed can order by when the user
6666+ // actually RSVP'd (record.createdAt) — not by when contrail indexed
6767+ // it (time_us). Without this, a fresh backfill clusters thousands of
6868+ // historical RSVPs at the top of time_us order, drowning live activity.
6969+ createdAt: { type: 'range' }
6570 },
6671 references: {
6772 event: {
+1-1
src/lib/contrail/index.ts
···11import { Contrail } from '@atmo-dev/contrail';
22import { createHandler } from '@atmo-dev/contrail/server';
33import { Client } from '@atcute/client';
44-import { config } from './config';
44+import { config } from '../contrail.config';
55import { getSpacesConfig, spacesAvailable } from '../spaces/config';
6677const spaces = getSpacesConfig();