···3737 DB: D1Database;
3838 CRON_SECRET: string;
3939 };
4040+ /** Cloudflare Worker execution context. Use `ctx.waitUntil(promise)` to
4141+ * let the worker keep a fire-and-forget task alive after the response
4242+ * has been sent. Optional in dev (wrangler proxy may not provide it). */
4343+ ctx?: { waitUntil(promise: Promise<unknown>): void };
4044 }
4145 }
4246}
+2
src/lexicon-types/index.ts
···11export * as AppBskyActorProfile from "./types/app/bsky/actor/profile.js";
22+export * as AppBskyGraphFollow from "./types/app/bsky/graph/follow.js";
23export * as CommunityLexiconCalendarEvent from "./types/community/lexicon/calendar/event.js";
34export * as CommunityLexiconCalendarRsvp from "./types/community/lexicon/calendar/rsvp.js";
45export * as CommunityLexiconLocationAddress from "./types/community/lexicon/location/address.js";
···89export * as RsvpAtmoEventGetRecord from "./types/rsvp/atmo/event/getRecord.js";
910export * as RsvpAtmoEventListRecords from "./types/rsvp/atmo/event/listRecords.js";
1011export * as RsvpAtmoGetCursor from "./types/rsvp/atmo/getCursor.js";
1212+export * as RsvpAtmoGetFeed from "./types/rsvp/atmo/getFeed.js";
1113export * as RsvpAtmoGetOverview from "./types/rsvp/atmo/getOverview.js";
1214export * as RsvpAtmoGetProfile from "./types/rsvp/atmo/getProfile.js";
1315export * as RsvpAtmoInviteCreate from "./types/rsvp/atmo/invite/create.js";
+30
src/lexicon-types/types/app/bsky/graph/follow.ts
···11+import type {} from "@atcute/lexicons";
22+import * as v from "@atcute/lexicons/validations";
33+import type {} from "@atcute/lexicons/ambient";
44+import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef";
55+66+const _mainSchema = /*#__PURE__*/ v.record(
77+ /*#__PURE__*/ v.tidString(),
88+ /*#__PURE__*/ v.object({
99+ $type: /*#__PURE__*/ v.literal("app.bsky.graph.follow"),
1010+ createdAt: /*#__PURE__*/ v.datetimeString(),
1111+ subject: /*#__PURE__*/ v.didString(),
1212+ get via() {
1313+ return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema);
1414+ },
1515+ }),
1616+);
1717+1818+type main$schematype = typeof _mainSchema;
1919+2020+export interface mainSchema extends main$schematype {}
2121+2222+export const mainSchema = _mainSchema as mainSchema;
2323+2424+export interface Main extends v.InferInput<typeof mainSchema> {}
2525+2626+declare module "@atcute/lexicons/ambient" {
2727+ interface Records {
2828+ "app.bsky.graph.follow": mainSchema;
2929+ }
3030+}
···6262 queryable: {
6363 status: {},
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.
6965 createdAt: { type: 'range' }
7066 },
7167 references: {
···7470 field: 'subject.uri'
7571 }
7672 }
7373+ }
7474+ // `follow` (app.bsky.graph.follow) is auto-added by contrail 0.5+ when
7575+ // `feeds` is configured: discover:false, subjectField:'subject' (so only
7676+ // follows whose subject is already in identities are indexed).
7777+ },
7878+ feeds: {
7979+ // Exposed as rsvp.atmo.getFeed?feed=network&actor=<did>&collection=<nsid>.
8080+ // Powers the home-page "from people you follow" surface.
8181+ network: {
8282+ targets: ['event', 'rsvp']
7783 }
7884 }
7985};